mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	update latest upstream-2021-08-16
This commit is contained in:
		
							parent
							
								
									efb1080dd6
								
							
						
					
					
						commit
						bd71445296
					
				
					 36 changed files with 99 additions and 7357 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -26,6 +26,7 @@ cscope.in.out
 | 
				
			||||||
cscope.po.out
 | 
					cscope.po.out
 | 
				
			||||||
pulse-daemon.log
 | 
					pulse-daemon.log
 | 
				
			||||||
depcomp
 | 
					depcomp
 | 
				
			||||||
 | 
					install/
 | 
				
			||||||
install-sh
 | 
					install-sh
 | 
				
			||||||
libltdl
 | 
					libltdl
 | 
				
			||||||
libtool
 | 
					libtool
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,9 +6,9 @@
 | 
				
			||||||
# infrastructure on fd.o GitLab.
 | 
					# infrastructure on fd.o GitLab.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Once the container stage is done, we move on to the 'build' stage where we
 | 
					# Once the container stage is done, we move on to the 'build' stage where we
 | 
				
			||||||
# run an autotools and meson build in parallel. Currently, tests are also run
 | 
					# run meson build. Currently, tests are also run as part of the build stage as
 | 
				
			||||||
# as part of the build stage as there doesn't seem to be significant value to
 | 
					# there doesn't seem to be significant value to splitting the stages at the
 | 
				
			||||||
# splitting the stages at the moment.
 | 
					# moment.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
stages:
 | 
					stages:
 | 
				
			||||||
  - container
 | 
					  - container
 | 
				
			||||||
| 
						 | 
					@ -16,9 +16,10 @@ stages:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
variables:
 | 
					variables:
 | 
				
			||||||
  # Update this tag when you want to trigger a rebuild the container in which
 | 
					  # Update this tag when you want to trigger a rebuild the container in which
 | 
				
			||||||
  # CI runs, for example when adding new packages to UBUNTU_DEBS. The tag is
 | 
					  # CI runs, for example when adding new packages to FDO_DISTRIBUTION_PACKAGES.
 | 
				
			||||||
  # an arbitrary string that identifies the exact container contents.
 | 
					  # The tag is an arbitrary string that identifies the exact container
 | 
				
			||||||
  FDO_DISTRIBUTION_TAG: '2020-03-07-01'
 | 
					  # contents.
 | 
				
			||||||
 | 
					  FDO_DISTRIBUTION_TAG: '2021-03-01-02'
 | 
				
			||||||
  FDO_DISTRIBUTION_VERSION: '18.04'
 | 
					  FDO_DISTRIBUTION_VERSION: '18.04'
 | 
				
			||||||
  FDO_UPSTREAM_REPO: 'pulseaudio/pulseaudio'
 | 
					  FDO_UPSTREAM_REPO: 'pulseaudio/pulseaudio'
 | 
				
			||||||
  UBUNTU_IMAGE: "$CI_REGISTRY_IMAGE/ubuntu/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG"
 | 
					  UBUNTU_IMAGE: "$CI_REGISTRY_IMAGE/ubuntu/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG"
 | 
				
			||||||
| 
						 | 
					@ -42,8 +43,6 @@ build-container:
 | 
				
			||||||
    # Otherwise the changes won't have effect since an old container image will
 | 
					    # Otherwise the changes won't have effect since an old container image will
 | 
				
			||||||
    # be used.
 | 
					    # be used.
 | 
				
			||||||
    FDO_DISTRIBUTION_PACKAGES: >-
 | 
					    FDO_DISTRIBUTION_PACKAGES: >-
 | 
				
			||||||
      autoconf
 | 
					 | 
				
			||||||
      automake
 | 
					 | 
				
			||||||
      autopoint
 | 
					      autopoint
 | 
				
			||||||
      bash-completion
 | 
					      bash-completion
 | 
				
			||||||
      check
 | 
					      check
 | 
				
			||||||
| 
						 | 
					@ -73,7 +72,6 @@ build-container:
 | 
				
			||||||
      libssl-dev
 | 
					      libssl-dev
 | 
				
			||||||
      libsystemd-dev
 | 
					      libsystemd-dev
 | 
				
			||||||
      libtdb-dev
 | 
					      libtdb-dev
 | 
				
			||||||
      libtool
 | 
					 | 
				
			||||||
      libudev-dev
 | 
					      libudev-dev
 | 
				
			||||||
      libwebrtc-audio-processing-dev
 | 
					      libwebrtc-audio-processing-dev
 | 
				
			||||||
      libwrap0-dev
 | 
					      libwrap0-dev
 | 
				
			||||||
| 
						 | 
					@ -82,31 +80,13 @@ build-container:
 | 
				
			||||||
      libxml-parser-perl
 | 
					      libxml-parser-perl
 | 
				
			||||||
      libxml2-utils
 | 
					      libxml2-utils
 | 
				
			||||||
      libxtst-dev
 | 
					      libxtst-dev
 | 
				
			||||||
      make
 | 
					      m4
 | 
				
			||||||
      ninja-build
 | 
					      ninja-build
 | 
				
			||||||
      pkg-config
 | 
					      pkg-config
 | 
				
			||||||
      python3-setuptools
 | 
					      python3-setuptools
 | 
				
			||||||
      systemd
 | 
					      systemd
 | 
				
			||||||
      wget
 | 
					      wget
 | 
				
			||||||
 | 
					
 | 
				
			||||||
build-autotools:
 | 
					 | 
				
			||||||
  stage: build
 | 
					 | 
				
			||||||
  image: $UBUNTU_IMAGE
 | 
					 | 
				
			||||||
  script:
 | 
					 | 
				
			||||||
    - export MAKEFLAGS="-j$(nproc)"
 | 
					 | 
				
			||||||
    - NOCONFIGURE=1 ./bootstrap.sh
 | 
					 | 
				
			||||||
    - mkdir build
 | 
					 | 
				
			||||||
    - cd build
 | 
					 | 
				
			||||||
    - ../configure --localstatedir=/var
 | 
					 | 
				
			||||||
    - make
 | 
					 | 
				
			||||||
    - make check
 | 
					 | 
				
			||||||
    - make check-daemon
 | 
					 | 
				
			||||||
    - ulimit -c 0 # don't dump core files on tests that are supposed to assert
 | 
					 | 
				
			||||||
    - make distcheck
 | 
					 | 
				
			||||||
  artifacts:
 | 
					 | 
				
			||||||
    paths:
 | 
					 | 
				
			||||||
      - build/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
build-meson:
 | 
					build-meson:
 | 
				
			||||||
  stage: build
 | 
					  stage: build
 | 
				
			||||||
  image: $UBUNTU_IMAGE
 | 
					  image: $UBUNTU_IMAGE
 | 
				
			||||||
| 
						 | 
					@ -121,8 +101,10 @@ build-meson:
 | 
				
			||||||
    - meson build
 | 
					    - meson build
 | 
				
			||||||
    - cd build
 | 
					    - cd build
 | 
				
			||||||
    - ninja
 | 
					    - ninja
 | 
				
			||||||
 | 
					    - ulimit -c 0 # don't dump core files on tests that are supposed to assert
 | 
				
			||||||
    - ninja test
 | 
					    - ninja test
 | 
				
			||||||
    - ninja test-daemon
 | 
					    - ninja test-daemon
 | 
				
			||||||
 | 
					    - ninja dist
 | 
				
			||||||
  artifacts:
 | 
					  artifacts:
 | 
				
			||||||
    paths:
 | 
					    paths:
 | 
				
			||||||
      - build/
 | 
					      - build/
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,4 +19,3 @@ Attach the output to this bug report as pa-info.txt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### What is the expected *correct* behavior?
 | 
					### What is the expected *correct* behavior?
 | 
				
			||||||
(What you should see instead)
 | 
					(What you should see instead)
 | 
				
			||||||
  
 | 
					 | 
				
			||||||
							
								
								
									
										67
									
								
								.gitlab/merge_request_templates/Guidelines.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								.gitlab/merge_request_templates/Guidelines.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,67 @@
 | 
				
			||||||
 | 
					# Contribution Guidelines
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## A note for contributors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Thank you for your contribution!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please make sure you tick the box labelled `Allow commits from members who can
 | 
				
			||||||
 | 
					merge to the target branch`. This allows us to make minor edits ourselves, and
 | 
				
			||||||
 | 
					then automatically rebase and merge your changes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PulseAudio is currently maintained by three volunteer developers in their free
 | 
				
			||||||
 | 
					time (probably amounting to less than one full time developer), which is not
 | 
				
			||||||
 | 
					really enough, given the project size and scope. For this reason bug reports
 | 
				
			||||||
 | 
					and patch submissions are sometimes handled very slowly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For non-trivial patches, we meet biweekly on IRC to discuss and prioritise
 | 
				
			||||||
 | 
					outstanding MRs. If you haven't heard from us a few days after you create the
 | 
				
			||||||
 | 
					MR, please take a look at [the patch status
 | 
				
			||||||
 | 
					page](https://www.freedesktop.org/wiki/Software/PulseAudio/PatchStatus/).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If you don't see your MR in that list either, please don't hesitate to drop a
 | 
				
			||||||
 | 
					comment pinging us, and we'll try to at least respond and make sure your
 | 
				
			||||||
 | 
					request is tracked on that list.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Coding Style
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please take a look at the [coding style
 | 
				
			||||||
 | 
					documentation](https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/CodingStyle/)
 | 
				
			||||||
 | 
					on our wiki.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Commit messagse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We follow the standard git commit message format of a summary on the first line
 | 
				
			||||||
 | 
					(<=50 characterss for preference, <=72 characters otherwise), followed by a new
 | 
				
			||||||
 | 
					line, followed by a detailed commit message. An additional line at the end may
 | 
				
			||||||
 | 
					link to an issue being fixed by this MR.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The first line is usually a short description of "what" your commit does, and
 | 
				
			||||||
 | 
					the rest of the message describes the "why", along with any additional
 | 
				
			||||||
 | 
					information that readers might need to understand the rationale for the change.
 | 
				
			||||||
 | 
					If in doubt, more verbose is better than less.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If you need to describe the "how" of the commit, that is usually best
 | 
				
			||||||
 | 
					documented along with the code itself.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Commit messages are prefixed with the subsystem being affected. Your best bet
 | 
				
			||||||
 | 
					to figure out what is appropriate is to look at previous commit messages. An
 | 
				
			||||||
 | 
					example:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					sink: Reduce chat sink priority
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Some gaming sound cards have custom profiles with analog-game and
 | 
				
			||||||
 | 
					analog-chat mappings that exist simultaneously. The game sink should
 | 
				
			||||||
 | 
					have higher priority than the chat sink, but currently there's no way to
 | 
				
			||||||
 | 
					affect the sink priorities from the profile-set configuration (the
 | 
				
			||||||
 | 
					mapping priority is not propagated to the sink priority).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I first thought about adding the mapping priority to the sink priority,
 | 
				
			||||||
 | 
					but that could mess up the prioritization system in
 | 
				
			||||||
 | 
					pa_device_init_priority(). I ended up checking for the intended roles
 | 
				
			||||||
 | 
					property to reduce the chat sink priority. I also reduced the iec958
 | 
				
			||||||
 | 
					priority so that the chat and iec958 sinks don't end up with the same
 | 
				
			||||||
 | 
					priority.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/818
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
							
								
								
									
										148
									
								
								Makefile.am
									
										
									
									
									
								
							
							
						
						
									
										148
									
								
								Makefile.am
									
										
									
									
									
								
							| 
						 | 
					@ -1,148 +0,0 @@
 | 
				
			||||||
# This file is part of PulseAudio.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# PulseAudio is free software; you can redistribute it and/or modify
 | 
					 | 
				
			||||||
# it under the terms of the GNU Lesser General Public License as published by
 | 
					 | 
				
			||||||
# the Free Software Foundation; either version 2 of the License, or
 | 
					 | 
				
			||||||
# (at your option) any later version.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# PulseAudio is distributed in the hope that it will be useful, but
 | 
					 | 
				
			||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | 
					 | 
				
			||||||
# General Public License for more details.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ACLOCAL_AMFLAGS = -I m4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
EXTRA_DIST = \
 | 
					 | 
				
			||||||
	bootstrap.sh \
 | 
					 | 
				
			||||||
	coverity/model.c \
 | 
					 | 
				
			||||||
	.gitlab-ci.yml \
 | 
					 | 
				
			||||||
	.gitlab/issue_templates/Bug.md \
 | 
					 | 
				
			||||||
	git-version-gen \
 | 
					 | 
				
			||||||
	LICENSE \
 | 
					 | 
				
			||||||
	pulseaudio.supp \
 | 
					 | 
				
			||||||
	GPL \
 | 
					 | 
				
			||||||
	LGPL \
 | 
					 | 
				
			||||||
	doxygen/Makefile.am \
 | 
					 | 
				
			||||||
	doxygen/Makefile.in \
 | 
					 | 
				
			||||||
	doxygen/doxygen.conf.in \
 | 
					 | 
				
			||||||
	PROTOCOL \
 | 
					 | 
				
			||||||
	README \
 | 
					 | 
				
			||||||
	CODE_OF_CONDUCT.md \
 | 
					 | 
				
			||||||
	scripts/benchmark_memory_usage.sh \
 | 
					 | 
				
			||||||
	scripts/plot_memory_usage.gp \
 | 
					 | 
				
			||||||
	scripts/benchmarks/README \
 | 
					 | 
				
			||||||
	todo \
 | 
					 | 
				
			||||||
	.gitignore \
 | 
					 | 
				
			||||||
	doxygen/.gitignore \
 | 
					 | 
				
			||||||
	m4/.gitignore \
 | 
					 | 
				
			||||||
	man/.gitignore \
 | 
					 | 
				
			||||||
	po/.gitignore \
 | 
					 | 
				
			||||||
	scripts/benchmarks/.gitignore \
 | 
					 | 
				
			||||||
	src/.gitignore \
 | 
					 | 
				
			||||||
	src/daemon/.gitignore \
 | 
					 | 
				
			||||||
	src/pulse/.gitignore \
 | 
					 | 
				
			||||||
	meson.build \
 | 
					 | 
				
			||||||
	meson_options.txt \
 | 
					 | 
				
			||||||
	man/meson.build \
 | 
					 | 
				
			||||||
	po/meson.build \
 | 
					 | 
				
			||||||
	shell-completion/bash/meson.build \
 | 
					 | 
				
			||||||
	shell-completion/zsh/meson.build \
 | 
					 | 
				
			||||||
	src/daemon/meson.build \
 | 
					 | 
				
			||||||
	src/meson.build \
 | 
					 | 
				
			||||||
	src/modules/alsa/meson.build \
 | 
					 | 
				
			||||||
	src/modules/alsa/mixer/meson.build \
 | 
					 | 
				
			||||||
	src/modules/bluetooth/meson.build \
 | 
					 | 
				
			||||||
	src/modules/echo-cancel/meson.build \
 | 
					 | 
				
			||||||
	src/modules/gsettings/meson.build \
 | 
					 | 
				
			||||||
	src/modules/gsettings/meson_post_install.py \
 | 
					 | 
				
			||||||
	src/modules/meson.build \
 | 
					 | 
				
			||||||
	src/modules/oss/meson.build \
 | 
					 | 
				
			||||||
	src/modules/raop/meson.build \
 | 
					 | 
				
			||||||
	src/modules/rtp/meson.build \
 | 
					 | 
				
			||||||
	src/pulsecore/meson.build \
 | 
					 | 
				
			||||||
	src/pulse/meson.build \
 | 
					 | 
				
			||||||
	src/tests/meson.build \
 | 
					 | 
				
			||||||
	src/tests/test-daemon.meson.sh \
 | 
					 | 
				
			||||||
	src/utils/meson.build \
 | 
					 | 
				
			||||||
	vala/meson.build
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SUBDIRS = src doxygen man po
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
MAINTAINERCLEANFILES =
 | 
					 | 
				
			||||||
noinst_DATA =
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
vapidir = $(datadir)/vala/vapi
 | 
					 | 
				
			||||||
dist_vapi_DATA = \
 | 
					 | 
				
			||||||
		vala/libpulse.deps vala/libpulse.vapi \
 | 
					 | 
				
			||||||
		vala/libpulse-mainloop-glib.deps vala/libpulse-mainloop-glib.vapi \
 | 
					 | 
				
			||||||
		vala/libpulse-simple.deps vala/libpulse-simple.vapi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pkgconfigdir = $(libdir)/pkgconfig
 | 
					 | 
				
			||||||
pkgconfig_DATA = libpulse.pc libpulse-simple.pc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if HAVE_GLIB20
 | 
					 | 
				
			||||||
pkgconfig_DATA += \
 | 
					 | 
				
			||||||
	 libpulse-mainloop-glib.pc
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cmakedir = $(libdir)/cmake/PulseAudio
 | 
					 | 
				
			||||||
cmake_DATA = PulseAudioConfig.cmake PulseAudioConfigVersion.cmake
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bashcompletiondir=@bashcompletiondir@
 | 
					 | 
				
			||||||
dist_bashcompletion_DATA = shell-completion/bash/pulseaudio
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install-bashcompletion-aliases:
 | 
					 | 
				
			||||||
	cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio pactl
 | 
					 | 
				
			||||||
	cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio pacmd
 | 
					 | 
				
			||||||
	cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio pasuspender
 | 
					 | 
				
			||||||
	cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio padsp
 | 
					 | 
				
			||||||
	cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio pacat
 | 
					 | 
				
			||||||
	cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio paplay
 | 
					 | 
				
			||||||
	cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio parec
 | 
					 | 
				
			||||||
	cd $(DESTDIR)$(bashcompletiondir) && $(LN_S) -f pulseaudio parecord
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install-data-hook: install-bashcompletion-aliases
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
zshcompletiondir=@zshcompletiondir@
 | 
					 | 
				
			||||||
dist_zshcompletion_DATA = shell-completion/zsh/_pulseaudio
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
homepage: all dist doxygen
 | 
					 | 
				
			||||||
	test -d $$HOME/homepage/private
 | 
					 | 
				
			||||||
	mkdir -p $$HOME/homepage/private/projects/pulseaudio $$HOME/homepage/private/projects/pulseaudio/doxygen
 | 
					 | 
				
			||||||
	cp pulseaudio-@PACKAGE_VERSION@.tar.gz $$HOME/homepage/private/projects/pulseaudio
 | 
					 | 
				
			||||||
	cp pulseaudio-@PACKAGE_VERSION@.tar.gz $$HOME/git.fedora/pulseaudio
 | 
					 | 
				
			||||||
	cp -a doxygen/html/* $$HOME/homepage/private/projects/pulseaudio/doxygen
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
doxygen:
 | 
					 | 
				
			||||||
	$(MAKE) -C doxygen doxygen
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eolspace:
 | 
					 | 
				
			||||||
	find \( -name '*.c' -o -name '*.h' -o -name 'Makefile.am' \) -exec perl -i -pe 's/\s+\n$$/\1\n/;' \{\} \;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
untabify:
 | 
					 | 
				
			||||||
	find \( -name '*.c' -o -name '*.h' \) -exec perl -i -pe 's/\t/        /g;' \{\} \;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
fedora-snapshot: dist
 | 
					 | 
				
			||||||
	cp $(distdir).tar.gz $$HOME/git.fedora/pulseaudio/$(distdir).tar.gz
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dist-hook:
 | 
					 | 
				
			||||||
	echo $(VERSION) > $(distdir)/.tarball-version
 | 
					 | 
				
			||||||
	echo $(VERSION) > $(distdir)/.version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
check-daemon:
 | 
					 | 
				
			||||||
	$(MAKE) -C src check-daemon
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
check-daemon-long:
 | 
					 | 
				
			||||||
	$(MAKE) -C src check-daemon-long
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: homepage distcleancheck doxygen
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# see git-version-gen
 | 
					 | 
				
			||||||
BUILT_SOURCES = $(top_srcdir)/.version
 | 
					 | 
				
			||||||
$(top_srcdir)/.version:
 | 
					 | 
				
			||||||
	echo $(VERSION) > $@-t && mv $@-t $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DISTCHECK_CONFIGURE_FLAGS = --with-udev-rules-dir="$$dc_install_base/lib/udev/rules.d" --with-systemduserunitdir="$$dc_install_base/lib/systemd/user" --with-bash-completion-dir="$$dc_install_base/share/bash-completion/completions"
 | 
					 | 
				
			||||||
							
								
								
									
										22
									
								
								autogen.sh
									
										
									
									
									
								
							
							
						
						
									
										22
									
								
								autogen.sh
									
										
									
									
									
								
							| 
						 | 
					@ -1,22 +0,0 @@
 | 
				
			||||||
#!/bin/sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# This file is part of PulseAudio.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# PulseAudio is free software; you can redistribute it and/or modify it
 | 
					 | 
				
			||||||
# under the terms of the GNU Lesser General Public License as published by
 | 
					 | 
				
			||||||
# the Free Software Foundation; either version 2 of the License, or
 | 
					 | 
				
			||||||
# (at your option) any later version.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# PulseAudio is distributed in the hope that it will be useful, but
 | 
					 | 
				
			||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | 
					 | 
				
			||||||
# General Public License for more details.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Only there to make jhbuild happy
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NOCONFIGURE=1 ./bootstrap.sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
exec ./configure  "$@"
 | 
					 | 
				
			||||||
							
								
								
									
										48
									
								
								bootstrap.sh
									
										
									
									
									
								
							
							
						
						
									
										48
									
								
								bootstrap.sh
									
										
									
									
									
								
							| 
						 | 
					@ -1,48 +0,0 @@
 | 
				
			||||||
#!/usr/bin/env bash
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# This file is part of PulseAudio.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# PulseAudio is free software; you can redistribute it and/or modify it
 | 
					 | 
				
			||||||
# under the terms of the GNU Lesser General Public License as published by
 | 
					 | 
				
			||||||
# the Free Software Foundation; either version 2 of the License, or
 | 
					 | 
				
			||||||
# (at your option) any later version.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# PulseAudio is distributed in the hope that it will be useful, but
 | 
					 | 
				
			||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | 
					 | 
				
			||||||
# General Public License for more details.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if [ -f .git/hooks/pre-commit.sample -a ! -f .git/hooks/pre-commit ] ; then
 | 
					 | 
				
			||||||
    cp -p .git/hooks/pre-commit.sample .git/hooks/pre-commit && \
 | 
					 | 
				
			||||||
    chmod +x .git/hooks/pre-commit && \
 | 
					 | 
				
			||||||
    echo "Activated pre-commit hook."
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if [ -f .tarball-version ]; then
 | 
					 | 
				
			||||||
    echo "Marking tarball version as modified."
 | 
					 | 
				
			||||||
    echo -n `cat .tarball-version | sed 's/-rebootstrapped$//'`-rebootstrapped >.tarball-version
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# We check for this here, because if pkg-config is not found in the
 | 
					 | 
				
			||||||
# system, it's likely that the pkg.m4 macro file is also not present,
 | 
					 | 
				
			||||||
# which will make PKG_PROG_PKG_CONFIG be undefined and the generated
 | 
					 | 
				
			||||||
# configure file faulty.
 | 
					 | 
				
			||||||
if ! pkg-config --version &>/dev/null; then
 | 
					 | 
				
			||||||
    echo "pkg-config is required to bootstrap this program"
 | 
					 | 
				
			||||||
    exit 1
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
# Other necessary programs
 | 
					 | 
				
			||||||
if ! autopoint --version &>/dev/null ; then
 | 
					 | 
				
			||||||
    echo "autopoint is required to bootstrap this program"
 | 
					 | 
				
			||||||
    exit 1
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
autoreconf --force --install --verbose
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if test "x$NOCONFIGURE" = "x"; then
 | 
					 | 
				
			||||||
    CFLAGS="$CFLAGS -g -O0" ./configure --enable-force-preopen "$@" && \
 | 
					 | 
				
			||||||
        make clean
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
							
								
								
									
										1761
									
								
								configure.ac
									
										
									
									
									
								
							
							
						
						
									
										1761
									
								
								configure.ac
									
										
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
					@ -1,22 +0,0 @@
 | 
				
			||||||
# This file is part of PulseAudio.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# PulseAudio is free software; you can redistribute it and/or modify
 | 
					 | 
				
			||||||
# it under the terms of the GNU Lesser General Public License as published by
 | 
					 | 
				
			||||||
# the Free Software Foundation; either version 2 of the License, or
 | 
					 | 
				
			||||||
# (at your option) any later version.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# PulseAudio is distributed in the hope that it will be useful, but
 | 
					 | 
				
			||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | 
					 | 
				
			||||||
# General Public License for more details.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
doxygen: doxygen.conf
 | 
					 | 
				
			||||||
	doxygen $<
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean-local:
 | 
					 | 
				
			||||||
	-rm -rf html
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: all doxygen
 | 
					 | 
				
			||||||
							
								
								
									
										37
									
								
								m4/.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								m4/.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,37 +0,0 @@
 | 
				
			||||||
codeset.m4
 | 
					 | 
				
			||||||
extern-inline.m4
 | 
					 | 
				
			||||||
fcntl-o.m4
 | 
					 | 
				
			||||||
gettext.m4
 | 
					 | 
				
			||||||
glibc2.m4
 | 
					 | 
				
			||||||
glibc21.m4
 | 
					 | 
				
			||||||
iconv.m4
 | 
					 | 
				
			||||||
intdiv0.m4
 | 
					 | 
				
			||||||
intl.m4
 | 
					 | 
				
			||||||
intldir.m4
 | 
					 | 
				
			||||||
intlmacosx.m4
 | 
					 | 
				
			||||||
intmax.m4
 | 
					 | 
				
			||||||
inttypes-pri.m4
 | 
					 | 
				
			||||||
inttypes_h.m4
 | 
					 | 
				
			||||||
lcmessage.m4
 | 
					 | 
				
			||||||
lib-ld.m4
 | 
					 | 
				
			||||||
lib-link.m4
 | 
					 | 
				
			||||||
lib-prefix.m4
 | 
					 | 
				
			||||||
libtool.m4
 | 
					 | 
				
			||||||
lock.m4
 | 
					 | 
				
			||||||
longlong.m4
 | 
					 | 
				
			||||||
ltoptions.m4
 | 
					 | 
				
			||||||
ltsugar.m4
 | 
					 | 
				
			||||||
ltversion.m4
 | 
					 | 
				
			||||||
lt~obsolete.m4
 | 
					 | 
				
			||||||
nls.m4
 | 
					 | 
				
			||||||
po.m4
 | 
					 | 
				
			||||||
printf-posix.m4
 | 
					 | 
				
			||||||
progtest.m4
 | 
					 | 
				
			||||||
size_max.m4
 | 
					 | 
				
			||||||
stdint_h.m4
 | 
					 | 
				
			||||||
threadlib.m4
 | 
					 | 
				
			||||||
uintmax_t.m4
 | 
					 | 
				
			||||||
visibility.m4
 | 
					 | 
				
			||||||
wchar_t.m4
 | 
					 | 
				
			||||||
wint_t.m4
 | 
					 | 
				
			||||||
xsize.m4
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,19 +0,0 @@
 | 
				
			||||||
AC_DEFUN([ACX_LIBWRAP], [
 | 
					 | 
				
			||||||
LIBWRAP_LIBS=
 | 
					 | 
				
			||||||
saved_LIBS="$LIBS"
 | 
					 | 
				
			||||||
LIBS="$LIBS -lwrap"
 | 
					 | 
				
			||||||
AC_MSG_CHECKING([for tcpwrap library and headers])
 | 
					 | 
				
			||||||
AC_LINK_IFELSE(
 | 
					 | 
				
			||||||
[AC_LANG_PROGRAM(
 | 
					 | 
				
			||||||
[#include <tcpd.h>
 | 
					 | 
				
			||||||
#include <syslog.h>
 | 
					 | 
				
			||||||
int allow_severity = LOG_INFO;
 | 
					 | 
				
			||||||
int deny_severity = LOG_WARNING;],
 | 
					 | 
				
			||||||
[struct request_info *req;
 | 
					 | 
				
			||||||
return hosts_access (req);])],
 | 
					 | 
				
			||||||
[AC_DEFINE(HAVE_LIBWRAP, [], [Have tcpwrap?])
 | 
					 | 
				
			||||||
LIBWRAP_LIBS="-lwrap"
 | 
					 | 
				
			||||||
AC_MSG_RESULT(yes)],
 | 
					 | 
				
			||||||
[AC_MSG_RESULT(no)])
 | 
					 | 
				
			||||||
LIBS="$saved_LIBS"
 | 
					 | 
				
			||||||
])
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,74 +0,0 @@
 | 
				
			||||||
# ===========================================================================
 | 
					 | 
				
			||||||
#   http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
 | 
					 | 
				
			||||||
# ===========================================================================
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# SYNOPSIS
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# DESCRIPTION
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Check whether the given FLAG works with the current language's compiler
 | 
					 | 
				
			||||||
#   or gives an error.  (Warnings, however, are ignored)
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
 | 
					 | 
				
			||||||
#   success/failure.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   If EXTRA-FLAGS is defined, it is added to the current language's default
 | 
					 | 
				
			||||||
#   flags (e.g. CFLAGS) when the check is done.  The check is thus made with
 | 
					 | 
				
			||||||
#   the flags: "CFLAGS EXTRA-FLAGS FLAG".  This can for example be used to
 | 
					 | 
				
			||||||
#   force the compiler to issue an error when a bad flag is given.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   INPUT gives an alternative input source to AC_COMPILE_IFELSE.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
 | 
					 | 
				
			||||||
#   macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# LICENSE
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
 | 
					 | 
				
			||||||
#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   This program is free software: you can 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 <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   As a special exception, the respective Autoconf Macro's copyright owner
 | 
					 | 
				
			||||||
#   gives unlimited permission to copy, distribute and modify the configure
 | 
					 | 
				
			||||||
#   scripts that are the output of Autoconf when processing the Macro. You
 | 
					 | 
				
			||||||
#   need not follow the terms of the GNU General Public License when using
 | 
					 | 
				
			||||||
#   or distributing such scripts, even though portions of the text of the
 | 
					 | 
				
			||||||
#   Macro appear in them. The GNU General Public License (GPL) does govern
 | 
					 | 
				
			||||||
#   all other use of the material that constitutes the Autoconf Macro.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   This special exception to the GPL applies to versions of the Autoconf
 | 
					 | 
				
			||||||
#   Macro released by the Autoconf Archive. When you make and distribute a
 | 
					 | 
				
			||||||
#   modified version of the Autoconf Macro, you may extend this special
 | 
					 | 
				
			||||||
#   exception to the GPL to apply to your modified version as well.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#serial 4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
 | 
					 | 
				
			||||||
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
 | 
					 | 
				
			||||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
 | 
					 | 
				
			||||||
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
 | 
					 | 
				
			||||||
  ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
 | 
					 | 
				
			||||||
  _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
 | 
					 | 
				
			||||||
  AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
 | 
					 | 
				
			||||||
    [AS_VAR_SET(CACHEVAR,[yes])],
 | 
					 | 
				
			||||||
    [AS_VAR_SET(CACHEVAR,[no])])
 | 
					 | 
				
			||||||
  _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
 | 
					 | 
				
			||||||
AS_VAR_IF(CACHEVAR,yes,
 | 
					 | 
				
			||||||
  [m4_default([$2], :)],
 | 
					 | 
				
			||||||
  [m4_default([$3], :)])
 | 
					 | 
				
			||||||
AS_VAR_POPDEF([CACHEVAR])dnl
 | 
					 | 
				
			||||||
])dnl AX_CHECK_COMPILE_FLAGS
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,92 +0,0 @@
 | 
				
			||||||
# ===========================================================================
 | 
					 | 
				
			||||||
#      http://www.gnu.org/software/autoconf-archive/ax_check_define.html
 | 
					 | 
				
			||||||
# ===========================================================================
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# SYNOPSIS
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   AC_CHECK_DEFINE([symbol], [ACTION-IF-FOUND], [ACTION-IF-NOT])
 | 
					 | 
				
			||||||
#   AX_CHECK_DEFINE([includes],[symbol], [ACTION-IF-FOUND], [ACTION-IF-NOT])
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# DESCRIPTION
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Complements AC_CHECK_FUNC but it does not check for a function but for a
 | 
					 | 
				
			||||||
#   define to exist. Consider a usage like:
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#    AC_CHECK_DEFINE(__STRICT_ANSI__, CFLAGS="$CFLAGS -D_XOPEN_SOURCE=500")
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# LICENSE
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   This program is free software; you can 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 <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   As a special exception, the respective Autoconf Macro's copyright owner
 | 
					 | 
				
			||||||
#   gives unlimited permission to copy, distribute and modify the configure
 | 
					 | 
				
			||||||
#   scripts that are the output of Autoconf when processing the Macro. You
 | 
					 | 
				
			||||||
#   need not follow the terms of the GNU General Public License when using
 | 
					 | 
				
			||||||
#   or distributing such scripts, even though portions of the text of the
 | 
					 | 
				
			||||||
#   Macro appear in them. The GNU General Public License (GPL) does govern
 | 
					 | 
				
			||||||
#   all other use of the material that constitutes the Autoconf Macro.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   This special exception to the GPL applies to versions of the Autoconf
 | 
					 | 
				
			||||||
#   Macro released by the Autoconf Archive. When you make and distribute a
 | 
					 | 
				
			||||||
#   modified version of the Autoconf Macro, you may extend this special
 | 
					 | 
				
			||||||
#   exception to the GPL to apply to your modified version as well.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#serial 8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AU_ALIAS([AC_CHECK_DEFINED], [AC_CHECK_DEFINE])
 | 
					 | 
				
			||||||
AC_DEFUN([AC_CHECK_DEFINE],[
 | 
					 | 
				
			||||||
AS_VAR_PUSHDEF([ac_var],[ac_cv_defined_$1])dnl
 | 
					 | 
				
			||||||
AC_CACHE_CHECK([for $1 defined], ac_var,
 | 
					 | 
				
			||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
 | 
					 | 
				
			||||||
  #ifdef $1
 | 
					 | 
				
			||||||
  int ok;
 | 
					 | 
				
			||||||
  #else
 | 
					 | 
				
			||||||
  choke me
 | 
					 | 
				
			||||||
  #endif
 | 
					 | 
				
			||||||
]])],[AS_VAR_SET(ac_var, yes)],[AS_VAR_SET(ac_var, no)]))
 | 
					 | 
				
			||||||
AS_IF([test AS_VAR_GET(ac_var) != "no"], [$2], [$3])dnl
 | 
					 | 
				
			||||||
AS_VAR_POPDEF([ac_var])dnl
 | 
					 | 
				
			||||||
])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AU_ALIAS([AX_CHECK_DEFINED], [AX_CHECK_DEFINE])
 | 
					 | 
				
			||||||
AC_DEFUN([AX_CHECK_DEFINE],[
 | 
					 | 
				
			||||||
AS_VAR_PUSHDEF([ac_var],[ac_cv_defined_$2_$1])dnl
 | 
					 | 
				
			||||||
AC_CACHE_CHECK([for $2 defined in $1], ac_var,
 | 
					 | 
				
			||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <$1>]], [[
 | 
					 | 
				
			||||||
  #ifdef $2
 | 
					 | 
				
			||||||
  int ok;
 | 
					 | 
				
			||||||
  #else
 | 
					 | 
				
			||||||
  choke me
 | 
					 | 
				
			||||||
  #endif
 | 
					 | 
				
			||||||
]])],[AS_VAR_SET(ac_var, yes)],[AS_VAR_SET(ac_var, no)]))
 | 
					 | 
				
			||||||
AS_IF([test AS_VAR_GET(ac_var) != "no"], [$3], [$4])dnl
 | 
					 | 
				
			||||||
AS_VAR_POPDEF([ac_var])dnl
 | 
					 | 
				
			||||||
])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_DEFUN([AX_CHECK_FUNC],
 | 
					 | 
				
			||||||
[AS_VAR_PUSHDEF([ac_var], [ac_cv_func_$2])dnl
 | 
					 | 
				
			||||||
AC_CACHE_CHECK([for $2], ac_var,
 | 
					 | 
				
			||||||
dnl AC_LANG_FUNC_LINK_TRY
 | 
					 | 
				
			||||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([$1
 | 
					 | 
				
			||||||
                #undef $2
 | 
					 | 
				
			||||||
                char $2 ();],[
 | 
					 | 
				
			||||||
                char (*f) () = $2;
 | 
					 | 
				
			||||||
                return f != $2; ])],
 | 
					 | 
				
			||||||
                [AS_VAR_SET(ac_var, yes)],
 | 
					 | 
				
			||||||
                [AS_VAR_SET(ac_var, no)])])
 | 
					 | 
				
			||||||
AS_IF([test AS_VAR_GET(ac_var) = yes], [$3], [$4])dnl
 | 
					 | 
				
			||||||
AS_VAR_POPDEF([ac_var])dnl
 | 
					 | 
				
			||||||
])# AC_CHECK_FUNC
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,147 +0,0 @@
 | 
				
			||||||
# ===========================================================================
 | 
					 | 
				
			||||||
#       http://www.gnu.org/software/autoconf-archive/ax_check_flag.html
 | 
					 | 
				
			||||||
# ===========================================================================
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# SYNOPSIS
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   AX_CHECK_PREPROC_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
 | 
					 | 
				
			||||||
#   AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
 | 
					 | 
				
			||||||
#   AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
 | 
					 | 
				
			||||||
#   AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE])
 | 
					 | 
				
			||||||
#   AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS])
 | 
					 | 
				
			||||||
#   AX_APPEND_LINK_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS])
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# DESCRIPTION
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Check whether the given FLAG works with the current language's
 | 
					 | 
				
			||||||
#   preprocessor/compiler/linker, or whether they give an error. (Warnings,
 | 
					 | 
				
			||||||
#   however, are ignored.)
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
 | 
					 | 
				
			||||||
#   success/failure.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   If EXTRA-FLAGS is defined, it is added to the current language's default
 | 
					 | 
				
			||||||
#   flags (e.g.  CFLAGS) when the check is done.  The check us thus made
 | 
					 | 
				
			||||||
#   with the following flags: "CFLAGS EXTRA-FLAGS FLAG".  EXTRA-FLAGS can
 | 
					 | 
				
			||||||
#   for example be used to force the compiler to issue an error when a bad
 | 
					 | 
				
			||||||
#   flag is given.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   AX_APPEND_FLAG appends the FLAG to the FLAG-VARIABLE shell variable or
 | 
					 | 
				
			||||||
#   the current language's flags if not specified.  FLAG is not added to
 | 
					 | 
				
			||||||
#   FLAG-VARIABLE if it is already in the shell variable.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   AX_APPEND_COMPILE_FLAGS checks for each FLAG1, FLAG2, etc. using
 | 
					 | 
				
			||||||
#   AX_CHECK_COMPILE_FLAG and if the check is successful the flag is added
 | 
					 | 
				
			||||||
#   to the appropriate FLAGS variable with AX_APPEND_FLAG.  The
 | 
					 | 
				
			||||||
#   FLAGS-VARIABLE and EXTRA-FLAGS arguments are the same as in the other
 | 
					 | 
				
			||||||
#   macros. AX_APPEND_LINK_FLAGS does the same for linker flags.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   NOTE: Based on AX_CHECK_COMPILER_FLAGS and AX_CFLAGS_GCC_OPTION.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# LICENSE
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
 | 
					 | 
				
			||||||
#   Copyright (c) 2009 Steven G. Johnson <stevenj@alum.mit.edu>
 | 
					 | 
				
			||||||
#   Copyright (c) 2009 Matteo Frigo
 | 
					 | 
				
			||||||
#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   This program is free software: you can 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 <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   As a special exception, the respective Autoconf Macro's copyright owner
 | 
					 | 
				
			||||||
#   gives unlimited permission to copy, distribute and modify the configure
 | 
					 | 
				
			||||||
#   scripts that are the output of Autoconf when processing the Macro. You
 | 
					 | 
				
			||||||
#   need not follow the terms of the GNU General Public License when using
 | 
					 | 
				
			||||||
#   or distributing such scripts, even though portions of the text of the
 | 
					 | 
				
			||||||
#   Macro appear in them. The GNU General Public License (GPL) does govern
 | 
					 | 
				
			||||||
#   all other use of the material that constitutes the Autoconf Macro.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   This special exception to the GPL applies to versions of the Autoconf
 | 
					 | 
				
			||||||
#   Macro released by the Autoconf Archive. When you make and distribute a
 | 
					 | 
				
			||||||
#   modified version of the Autoconf Macro, you may extend this special
 | 
					 | 
				
			||||||
#   exception to the GPL to apply to your modified version as well.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#serial 2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_DEFUN([AX_CHECK_PREPROC_FLAG],
 | 
					 | 
				
			||||||
[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX
 | 
					 | 
				
			||||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]cppflags_$4_$1])dnl
 | 
					 | 
				
			||||||
AC_CACHE_CHECK([whether _AC_LANG preprocessor accepts $1], CACHEVAR, [
 | 
					 | 
				
			||||||
  ax_check_save_flags=$CPPFLAGS
 | 
					 | 
				
			||||||
  CPPFLAGS="$CPPFLAGS $4 $1"
 | 
					 | 
				
			||||||
  AC_PREPROC_IFELSE([AC_LANG_PROGRAM()],
 | 
					 | 
				
			||||||
    [AS_VAR_SET([CACHEVAR],[yes])],
 | 
					 | 
				
			||||||
    [AS_VAR_SET([CACHEVAR],[no])])
 | 
					 | 
				
			||||||
  CPPFLAGS=$ax_check_save_flags])
 | 
					 | 
				
			||||||
AS_VAR_IF([CACHEVAR], "yes",
 | 
					 | 
				
			||||||
  [m4_default([$2], :)],
 | 
					 | 
				
			||||||
  [m4_default([$3], :)])
 | 
					 | 
				
			||||||
AS_VAR_POPDEF([CACHEVAR])dnl
 | 
					 | 
				
			||||||
])dnl AX_CHECK_PREPROC_FLAGS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
 | 
					 | 
				
			||||||
[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX
 | 
					 | 
				
			||||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
 | 
					 | 
				
			||||||
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
 | 
					 | 
				
			||||||
  ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
 | 
					 | 
				
			||||||
  _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
 | 
					 | 
				
			||||||
  AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
 | 
					 | 
				
			||||||
    [AS_VAR_SET([CACHEVAR],[yes])],
 | 
					 | 
				
			||||||
    [AS_VAR_SET([CACHEVAR],[no])])
 | 
					 | 
				
			||||||
  _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
 | 
					 | 
				
			||||||
AS_VAR_IF([CACHEVAR], "yes",
 | 
					 | 
				
			||||||
  [m4_default([$2], :)],
 | 
					 | 
				
			||||||
  [m4_default([$3], :)])
 | 
					 | 
				
			||||||
AS_VAR_POPDEF([CACHEVAR])dnl
 | 
					 | 
				
			||||||
])dnl AX_CHECK_COMPILE_FLAGS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_DEFUN([AX_CHECK_LINK_FLAG],
 | 
					 | 
				
			||||||
[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl
 | 
					 | 
				
			||||||
AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [
 | 
					 | 
				
			||||||
  ax_check_save_flags=$LDFLAGS
 | 
					 | 
				
			||||||
  LDFLAGS="$LDFLAGS $4 $1"
 | 
					 | 
				
			||||||
  AC_LINK_IFELSE([AC_LANG_PROGRAM()],
 | 
					 | 
				
			||||||
    [AS_VAR_SET([CACHEVAR],[yes])],
 | 
					 | 
				
			||||||
    [AS_VAR_SET([CACHEVAR],[no])])
 | 
					 | 
				
			||||||
  LDFLAGS=$ax_check_save_flags])
 | 
					 | 
				
			||||||
AS_VAR_IF([CACHEVAR], "yes",
 | 
					 | 
				
			||||||
  [m4_default([$2], :)],
 | 
					 | 
				
			||||||
  [m4_default([$3], :)])
 | 
					 | 
				
			||||||
AS_VAR_POPDEF([CACHEVAR])dnl
 | 
					 | 
				
			||||||
])dnl AX_CHECK_LINK_FLAGS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_DEFUN([AX_APPEND_FLAG],
 | 
					 | 
				
			||||||
[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX
 | 
					 | 
				
			||||||
AC_REQUIRE([AC_PROG_GREP])
 | 
					 | 
				
			||||||
AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[]FLAGS)])dnl
 | 
					 | 
				
			||||||
AS_VAR_SET_IF([FLAGS],
 | 
					 | 
				
			||||||
  [AS_IF([AS_ECHO(" $[]FLAGS ") | $GREP " $1 " 2>&1 >/dev/null],
 | 
					 | 
				
			||||||
    [AC_RUN_LOG([: FLAGS already contains $1])],
 | 
					 | 
				
			||||||
    [AC_RUN_LOG([: FLAGS="$FLAGS $1"])
 | 
					 | 
				
			||||||
    AS_VAR_APPEND([FLAGS], [" $1"])])],
 | 
					 | 
				
			||||||
  [AS_VAR_SET([FLAGS],[$1])])
 | 
					 | 
				
			||||||
AS_VAR_POPDEF([FLAGS])dnl
 | 
					 | 
				
			||||||
])dnl AX_APPEND_FLAG
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_DEFUN([AX_APPEND_COMPILE_FLAGS],
 | 
					 | 
				
			||||||
[for flag in $1; do
 | 
					 | 
				
			||||||
  AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3])
 | 
					 | 
				
			||||||
done
 | 
					 | 
				
			||||||
])dnl AX_APPEND_COMPILE_FLAGS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_DEFUN([AX_APPEND_LINK_FLAGS],
 | 
					 | 
				
			||||||
[for flag in $1; do
 | 
					 | 
				
			||||||
  AX_CHECK_LINK_FLAG([$flag], [AX_APPEND_FLAG([$flag], [m4_default([$2], [LDFLAGS])])], [], [$3])
 | 
					 | 
				
			||||||
done
 | 
					 | 
				
			||||||
])dnl AX_APPEND_LINK_FLAGS
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,558 +0,0 @@
 | 
				
			||||||
# ===========================================================================
 | 
					 | 
				
			||||||
#   http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
 | 
					 | 
				
			||||||
# ===========================================================================
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# SYNOPSIS
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# DESCRIPTION
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Check for baseline language coverage in the compiler for the specified
 | 
					 | 
				
			||||||
#   version of the C++ standard.  If necessary, add switches to CXXFLAGS to
 | 
					 | 
				
			||||||
#   enable support.  VERSION may be '11' (for the C++11 standard) or '14'
 | 
					 | 
				
			||||||
#   (for the C++14 standard).
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   The second argument, if specified, indicates whether you insist on an
 | 
					 | 
				
			||||||
#   extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
 | 
					 | 
				
			||||||
#   -std=c++11).  If neither is specified, you get whatever works, with
 | 
					 | 
				
			||||||
#   preference for an extended mode.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   The third argument, if specified 'mandatory' or if left unspecified,
 | 
					 | 
				
			||||||
#   indicates that baseline support for the specified C++ standard is
 | 
					 | 
				
			||||||
#   required and that the macro should error out if no mode with that
 | 
					 | 
				
			||||||
#   support is found.  If specified 'optional', then configuration proceeds
 | 
					 | 
				
			||||||
#   regardless, after defining HAVE_CXX${VERSION} if and only if a
 | 
					 | 
				
			||||||
#   supporting mode is found.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# LICENSE
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
 | 
					 | 
				
			||||||
#   Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
 | 
					 | 
				
			||||||
#   Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
 | 
					 | 
				
			||||||
#   Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
 | 
					 | 
				
			||||||
#   Copyright (c) 2015 Paul Norman <penorman@mac.com>
 | 
					 | 
				
			||||||
#   Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   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 any
 | 
					 | 
				
			||||||
#   warranty.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#serial 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl  This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
 | 
					 | 
				
			||||||
dnl  (serial version number 13).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
 | 
					 | 
				
			||||||
  m4_if([$1], [11], [],
 | 
					 | 
				
			||||||
        [$1], [14], [],
 | 
					 | 
				
			||||||
        [$1], [17], [m4_fatal([support for C++17 not yet implemented in AX_CXX_COMPILE_STDCXX])],
 | 
					 | 
				
			||||||
        [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
 | 
					 | 
				
			||||||
  m4_if([$2], [], [],
 | 
					 | 
				
			||||||
        [$2], [ext], [],
 | 
					 | 
				
			||||||
        [$2], [noext], [],
 | 
					 | 
				
			||||||
        [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
 | 
					 | 
				
			||||||
  m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
 | 
					 | 
				
			||||||
        [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
 | 
					 | 
				
			||||||
        [$3], [optional], [ax_cxx_compile_cxx$1_required=false],
 | 
					 | 
				
			||||||
        [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
 | 
					 | 
				
			||||||
  AC_LANG_PUSH([C++])dnl
 | 
					 | 
				
			||||||
  ac_success=no
 | 
					 | 
				
			||||||
  AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
 | 
					 | 
				
			||||||
  ax_cv_cxx_compile_cxx$1,
 | 
					 | 
				
			||||||
  [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
 | 
					 | 
				
			||||||
    [ax_cv_cxx_compile_cxx$1=yes],
 | 
					 | 
				
			||||||
    [ax_cv_cxx_compile_cxx$1=no])])
 | 
					 | 
				
			||||||
  if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
 | 
					 | 
				
			||||||
    ac_success=yes
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  m4_if([$2], [noext], [], [dnl
 | 
					 | 
				
			||||||
  if test x$ac_success = xno; then
 | 
					 | 
				
			||||||
    for switch in -std=gnu++$1 -std=gnu++0x; do
 | 
					 | 
				
			||||||
      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
 | 
					 | 
				
			||||||
      AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
 | 
					 | 
				
			||||||
                     $cachevar,
 | 
					 | 
				
			||||||
        [ac_save_CXXFLAGS="$CXXFLAGS"
 | 
					 | 
				
			||||||
         CXXFLAGS="$CXXFLAGS $switch"
 | 
					 | 
				
			||||||
         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
 | 
					 | 
				
			||||||
          [eval $cachevar=yes],
 | 
					 | 
				
			||||||
          [eval $cachevar=no])
 | 
					 | 
				
			||||||
         CXXFLAGS="$ac_save_CXXFLAGS"])
 | 
					 | 
				
			||||||
      if eval test x\$$cachevar = xyes; then
 | 
					 | 
				
			||||||
        CXXFLAGS="$CXXFLAGS $switch"
 | 
					 | 
				
			||||||
        ac_success=yes
 | 
					 | 
				
			||||||
        break
 | 
					 | 
				
			||||||
      fi
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
  fi])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  m4_if([$2], [ext], [], [dnl
 | 
					 | 
				
			||||||
  if test x$ac_success = xno; then
 | 
					 | 
				
			||||||
    dnl HP's aCC needs +std=c++11 according to:
 | 
					 | 
				
			||||||
    dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
 | 
					 | 
				
			||||||
    dnl Cray's crayCC needs "-h std=c++11"
 | 
					 | 
				
			||||||
    for switch in -std=c++$1 -std=c++0x +std=c++$1 "-h std=c++$1"; do
 | 
					 | 
				
			||||||
      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
 | 
					 | 
				
			||||||
      AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
 | 
					 | 
				
			||||||
                     $cachevar,
 | 
					 | 
				
			||||||
        [ac_save_CXXFLAGS="$CXXFLAGS"
 | 
					 | 
				
			||||||
         CXXFLAGS="$CXXFLAGS $switch"
 | 
					 | 
				
			||||||
         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
 | 
					 | 
				
			||||||
          [eval $cachevar=yes],
 | 
					 | 
				
			||||||
          [eval $cachevar=no])
 | 
					 | 
				
			||||||
         CXXFLAGS="$ac_save_CXXFLAGS"])
 | 
					 | 
				
			||||||
      if eval test x\$$cachevar = xyes; then
 | 
					 | 
				
			||||||
        CXXFLAGS="$CXXFLAGS $switch"
 | 
					 | 
				
			||||||
        ac_success=yes
 | 
					 | 
				
			||||||
        break
 | 
					 | 
				
			||||||
      fi
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
  fi])
 | 
					 | 
				
			||||||
  AC_LANG_POP([C++])
 | 
					 | 
				
			||||||
  if test x$ax_cxx_compile_cxx$1_required = xtrue; then
 | 
					 | 
				
			||||||
    if test x$ac_success = xno; then
 | 
					 | 
				
			||||||
      AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    if test x$ac_success = xno; then
 | 
					 | 
				
			||||||
      HAVE_CXX$1=0
 | 
					 | 
				
			||||||
      AC_MSG_NOTICE([No compiler with C++$1 support was found])
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      HAVE_CXX$1=1
 | 
					 | 
				
			||||||
      AC_DEFINE(HAVE_CXX$1,1,
 | 
					 | 
				
			||||||
                [define if the compiler supports basic C++$1 syntax])
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    AC_SUBST(HAVE_CXX$1)
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl  Test body for checking C++11 support
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
 | 
					 | 
				
			||||||
  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl  Test body for checking C++14 support
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
 | 
					 | 
				
			||||||
  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
 | 
					 | 
				
			||||||
  _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl  Tests for new features in C++11
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// If the compiler admits that it is not ready for C++11, why torture it?
 | 
					 | 
				
			||||||
// Hopefully, this will speed up the test.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef __cplusplus
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#error "This is not a C++ compiler"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#elif __cplusplus < 201103L
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#error "This is not a C++11 compiler"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace cxx11
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_static_assert
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template <typename T>
 | 
					 | 
				
			||||||
    struct check
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      static_assert(sizeof(int) <= sizeof(T), "not big enough");
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_final_override
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct Base
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      virtual void f() {}
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct Derived : public Base
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      virtual void f() override {}
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_double_right_angle_brackets
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template < typename T >
 | 
					 | 
				
			||||||
    struct check {};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    typedef check<void> single_type;
 | 
					 | 
				
			||||||
    typedef check<check<void>> double_type;
 | 
					 | 
				
			||||||
    typedef check<check<check<void>>> triple_type;
 | 
					 | 
				
			||||||
    typedef check<check<check<check<void>>>> quadruple_type;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_decltype
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    int
 | 
					 | 
				
			||||||
    f()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      int a = 1;
 | 
					 | 
				
			||||||
      decltype(a) b = 2;
 | 
					 | 
				
			||||||
      return a + b;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_type_deduction
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template < typename T1, typename T2 >
 | 
					 | 
				
			||||||
    struct is_same
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      static const bool value = false;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template < typename T >
 | 
					 | 
				
			||||||
    struct is_same<T, T>
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      static const bool value = true;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template < typename T1, typename T2 >
 | 
					 | 
				
			||||||
    auto
 | 
					 | 
				
			||||||
    add(T1 a1, T2 a2) -> decltype(a1 + a2)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      return a1 + a2;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    int
 | 
					 | 
				
			||||||
    test(const int c, volatile int v)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      static_assert(is_same<int, decltype(0)>::value == true, "");
 | 
					 | 
				
			||||||
      static_assert(is_same<int, decltype(c)>::value == false, "");
 | 
					 | 
				
			||||||
      static_assert(is_same<int, decltype(v)>::value == false, "");
 | 
					 | 
				
			||||||
      auto ac = c;
 | 
					 | 
				
			||||||
      auto av = v;
 | 
					 | 
				
			||||||
      auto sumi = ac + av + 'x';
 | 
					 | 
				
			||||||
      auto sumf = ac + av + 1.0;
 | 
					 | 
				
			||||||
      static_assert(is_same<int, decltype(ac)>::value == true, "");
 | 
					 | 
				
			||||||
      static_assert(is_same<int, decltype(av)>::value == true, "");
 | 
					 | 
				
			||||||
      static_assert(is_same<int, decltype(sumi)>::value == true, "");
 | 
					 | 
				
			||||||
      static_assert(is_same<int, decltype(sumf)>::value == false, "");
 | 
					 | 
				
			||||||
      static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
 | 
					 | 
				
			||||||
      return (sumf > 0.0) ? sumi : add(c, v);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_noexcept
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    int f() { return 0; }
 | 
					 | 
				
			||||||
    int g() noexcept { return 0; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    static_assert(noexcept(f()) == false, "");
 | 
					 | 
				
			||||||
    static_assert(noexcept(g()) == true, "");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_constexpr
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template < typename CharT >
 | 
					 | 
				
			||||||
    unsigned long constexpr
 | 
					 | 
				
			||||||
    strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      return *s ? strlen_c_r(s + 1, acc + 1) : acc;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template < typename CharT >
 | 
					 | 
				
			||||||
    unsigned long constexpr
 | 
					 | 
				
			||||||
    strlen_c(const CharT *const s) noexcept
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      return strlen_c_r(s, 0UL);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    static_assert(strlen_c("") == 0UL, "");
 | 
					 | 
				
			||||||
    static_assert(strlen_c("1") == 1UL, "");
 | 
					 | 
				
			||||||
    static_assert(strlen_c("example") == 7UL, "");
 | 
					 | 
				
			||||||
    static_assert(strlen_c("another\0example") == 7UL, "");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_rvalue_references
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template < int N >
 | 
					 | 
				
			||||||
    struct answer
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      static constexpr int value = N;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    answer<1> f(int&)       { return answer<1>(); }
 | 
					 | 
				
			||||||
    answer<2> f(const int&) { return answer<2>(); }
 | 
					 | 
				
			||||||
    answer<3> f(int&&)      { return answer<3>(); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void
 | 
					 | 
				
			||||||
    test()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      int i = 0;
 | 
					 | 
				
			||||||
      const int c = 0;
 | 
					 | 
				
			||||||
      static_assert(decltype(f(i))::value == 1, "");
 | 
					 | 
				
			||||||
      static_assert(decltype(f(c))::value == 2, "");
 | 
					 | 
				
			||||||
      static_assert(decltype(f(0))::value == 3, "");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_uniform_initialization
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct test
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      static const int zero {};
 | 
					 | 
				
			||||||
      static const int one {1};
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    static_assert(test::zero == 0, "");
 | 
					 | 
				
			||||||
    static_assert(test::one == 1, "");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_lambdas
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void
 | 
					 | 
				
			||||||
    test1()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      auto lambda1 = [](){};
 | 
					 | 
				
			||||||
      auto lambda2 = lambda1;
 | 
					 | 
				
			||||||
      lambda1();
 | 
					 | 
				
			||||||
      lambda2();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    int
 | 
					 | 
				
			||||||
    test2()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      auto a = [](int i, int j){ return i + j; }(1, 2);
 | 
					 | 
				
			||||||
      auto b = []() -> int { return '0'; }();
 | 
					 | 
				
			||||||
      auto c = [=](){ return a + b; }();
 | 
					 | 
				
			||||||
      auto d = [&](){ return c; }();
 | 
					 | 
				
			||||||
      auto e = [a, &b](int x) mutable {
 | 
					 | 
				
			||||||
        const auto identity = [](int y){ return y; };
 | 
					 | 
				
			||||||
        for (auto i = 0; i < a; ++i)
 | 
					 | 
				
			||||||
          a += b--;
 | 
					 | 
				
			||||||
        return x + identity(a + b);
 | 
					 | 
				
			||||||
      }(0);
 | 
					 | 
				
			||||||
      return a + b + c + d + e;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    int
 | 
					 | 
				
			||||||
    test3()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      const auto nullary = [](){ return 0; };
 | 
					 | 
				
			||||||
      const auto unary = [](int x){ return x; };
 | 
					 | 
				
			||||||
      using nullary_t = decltype(nullary);
 | 
					 | 
				
			||||||
      using unary_t = decltype(unary);
 | 
					 | 
				
			||||||
      const auto higher1st = [](nullary_t f){ return f(); };
 | 
					 | 
				
			||||||
      const auto higher2nd = [unary](nullary_t f1){
 | 
					 | 
				
			||||||
        return [unary, f1](unary_t f2){ return f2(unary(f1())); };
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
      return higher1st(nullary) + higher2nd(nullary)(unary);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_variadic_templates
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template <int...>
 | 
					 | 
				
			||||||
    struct sum;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template <int N0, int... N1toN>
 | 
					 | 
				
			||||||
    struct sum<N0, N1toN...>
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      static constexpr auto value = N0 + sum<N1toN...>::value;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template <>
 | 
					 | 
				
			||||||
    struct sum<>
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      static constexpr auto value = 0;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    static_assert(sum<>::value == 0, "");
 | 
					 | 
				
			||||||
    static_assert(sum<1>::value == 1, "");
 | 
					 | 
				
			||||||
    static_assert(sum<23>::value == 23, "");
 | 
					 | 
				
			||||||
    static_assert(sum<1, 2>::value == 3, "");
 | 
					 | 
				
			||||||
    static_assert(sum<5, 5, 11>::value == 21, "");
 | 
					 | 
				
			||||||
    static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
 | 
					 | 
				
			||||||
  // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
 | 
					 | 
				
			||||||
  // because of this.
 | 
					 | 
				
			||||||
  namespace test_template_alias_sfinae
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct foo {};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template<typename T>
 | 
					 | 
				
			||||||
    using member = typename T::member_type;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template<typename T>
 | 
					 | 
				
			||||||
    void func(...) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template<typename T>
 | 
					 | 
				
			||||||
    void func(member<T>*) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void test();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void test() { func<foo>(0); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace cxx11
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif  // __cplusplus >= 201103L
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
]])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl  Tests for new features in C++14
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// If the compiler admits that it is not ready for C++14, why torture it?
 | 
					 | 
				
			||||||
// Hopefully, this will speed up the test.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef __cplusplus
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#error "This is not a C++ compiler"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#elif __cplusplus < 201402L
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#error "This is not a C++14 compiler"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace cxx14
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_polymorphic_lambdas
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    int
 | 
					 | 
				
			||||||
    test()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      const auto lambda = [](auto&&... args){
 | 
					 | 
				
			||||||
        const auto istiny = [](auto x){
 | 
					 | 
				
			||||||
          return (sizeof(x) == 1UL) ? 1 : 0;
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        const int aretiny[] = { istiny(args)... };
 | 
					 | 
				
			||||||
        return aretiny[0];
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
      return lambda(1, 1L, 1.0f, '1');
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_binary_literals
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    constexpr auto ivii = 0b0000000000101010;
 | 
					 | 
				
			||||||
    static_assert(ivii == 42, "wrong value");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_generalized_constexpr
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template < typename CharT >
 | 
					 | 
				
			||||||
    constexpr unsigned long
 | 
					 | 
				
			||||||
    strlen_c(const CharT *const s) noexcept
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      auto length = 0UL;
 | 
					 | 
				
			||||||
      for (auto p = s; *p; ++p)
 | 
					 | 
				
			||||||
        ++length;
 | 
					 | 
				
			||||||
      return length;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    static_assert(strlen_c("") == 0UL, "");
 | 
					 | 
				
			||||||
    static_assert(strlen_c("x") == 1UL, "");
 | 
					 | 
				
			||||||
    static_assert(strlen_c("test") == 4UL, "");
 | 
					 | 
				
			||||||
    static_assert(strlen_c("another\0test") == 7UL, "");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_lambda_init_capture
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    int
 | 
					 | 
				
			||||||
    test()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      auto x = 0;
 | 
					 | 
				
			||||||
      const auto lambda1 = [a = x](int b){ return a + b; };
 | 
					 | 
				
			||||||
      const auto lambda2 = [a = lambda1(x)](){ return a; };
 | 
					 | 
				
			||||||
      return lambda2();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_digit_seperators
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    constexpr auto ten_million = 100'000'000;
 | 
					 | 
				
			||||||
    static_assert(ten_million == 100000000, "");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  namespace test_return_type_deduction
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    auto f(int& x) { return x; }
 | 
					 | 
				
			||||||
    decltype(auto) g(int& x) { return x; }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template < typename T1, typename T2 >
 | 
					 | 
				
			||||||
    struct is_same
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      static constexpr auto value = false;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    template < typename T >
 | 
					 | 
				
			||||||
    struct is_same<T, T>
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      static constexpr auto value = true;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    int
 | 
					 | 
				
			||||||
    test()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      auto x = 0;
 | 
					 | 
				
			||||||
      static_assert(is_same<int, decltype(f(x))>::value, "");
 | 
					 | 
				
			||||||
      static_assert(is_same<int&, decltype(g(x))>::value, "");
 | 
					 | 
				
			||||||
      return x;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace cxx14
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif  // __cplusplus >= 201402L
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
]])
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,39 +0,0 @@
 | 
				
			||||||
# ============================================================================
 | 
					 | 
				
			||||||
#  http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
 | 
					 | 
				
			||||||
# ============================================================================
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# SYNOPSIS
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   AX_CXX_COMPILE_STDCXX_11([ext|noext], [mandatory|optional])
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# DESCRIPTION
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Check for baseline language coverage in the compiler for the C++11
 | 
					 | 
				
			||||||
#   standard; if necessary, add switches to CXXFLAGS to enable support.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX
 | 
					 | 
				
			||||||
#   macro with the version set to C++11.  The two optional arguments are
 | 
					 | 
				
			||||||
#   forwarded literally as the second and third argument respectively.
 | 
					 | 
				
			||||||
#   Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for
 | 
					 | 
				
			||||||
#   more information.  If you want to use this macro, you also need to
 | 
					 | 
				
			||||||
#   download the ax_cxx_compile_stdcxx.m4 file.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# LICENSE
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
 | 
					 | 
				
			||||||
#   Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
 | 
					 | 
				
			||||||
#   Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
 | 
					 | 
				
			||||||
#   Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
 | 
					 | 
				
			||||||
#   Copyright (c) 2015 Paul Norman <penorman@mac.com>
 | 
					 | 
				
			||||||
#   Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   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 any
 | 
					 | 
				
			||||||
#   warranty.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#serial 14
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
include([ax_cxx_compile_stdcxx.m4])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [AX_CXX_COMPILE_STDCXX([11], [$1], [$2])])
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,49 +0,0 @@
 | 
				
			||||||
# ===========================================================================
 | 
					 | 
				
			||||||
#       http://www.gnu.org/software/autoconf-archive/ax_define_dir.html
 | 
					 | 
				
			||||||
# ===========================================================================
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# SYNOPSIS
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   AX_DEFINE_DIR(VARNAME, DIR [, DESCRIPTION])
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# DESCRIPTION
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   This macro sets VARNAME to the expansion of the DIR variable, taking
 | 
					 | 
				
			||||||
#   care of fixing up ${prefix} and such.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   VARNAME is then offered as both an output variable and a C preprocessor
 | 
					 | 
				
			||||||
#   symbol.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Example:
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#     AX_DEFINE_DIR([DATADIR], [datadir], [Where data are placed to.])
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# LICENSE
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Copyright (c) 2008 Stepan Kasal <kasal@ucw.cz>
 | 
					 | 
				
			||||||
#   Copyright (c) 2008 Andreas Schwab <schwab@suse.de>
 | 
					 | 
				
			||||||
#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
 | 
					 | 
				
			||||||
#   Copyright (c) 2008 Alexandre Oliva
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   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 any
 | 
					 | 
				
			||||||
#   warranty.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#serial 6
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AU_ALIAS([AC_DEFINE_DIR], [AX_DEFINE_DIR])
 | 
					 | 
				
			||||||
AC_DEFUN([AX_DEFINE_DIR], [
 | 
					 | 
				
			||||||
  prefix_NONE=
 | 
					 | 
				
			||||||
  exec_prefix_NONE=
 | 
					 | 
				
			||||||
  test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
 | 
					 | 
				
			||||||
  test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
 | 
					 | 
				
			||||||
dnl In Autoconf 2.60, ${datadir} refers to ${datarootdir}, which in turn
 | 
					 | 
				
			||||||
dnl refers to ${prefix}.  Thus we have to use `eval' twice.
 | 
					 | 
				
			||||||
  eval ax_define_dir="\"[$]$2\""
 | 
					 | 
				
			||||||
  eval ax_define_dir="\"$ax_define_dir\""
 | 
					 | 
				
			||||||
  AC_SUBST($1, "$ax_define_dir")
 | 
					 | 
				
			||||||
  AC_DEFINE_UNQUOTED($1, "$ax_define_dir", [$3])
 | 
					 | 
				
			||||||
  test "$prefix_NONE" && prefix=NONE
 | 
					 | 
				
			||||||
  test "$exec_prefix_NONE" && exec_prefix=NONE
 | 
					 | 
				
			||||||
])
 | 
					 | 
				
			||||||
							
								
								
									
										317
									
								
								m4/ax_pthread.m4
									
										
									
									
									
								
							
							
						
						
									
										317
									
								
								m4/ax_pthread.m4
									
										
									
									
									
								
							| 
						 | 
					@ -1,317 +0,0 @@
 | 
				
			||||||
# ===========================================================================
 | 
					 | 
				
			||||||
#        http://www.gnu.org/software/autoconf-archive/ax_pthread.html
 | 
					 | 
				
			||||||
# ===========================================================================
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# SYNOPSIS
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# DESCRIPTION
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   This macro figures out how to build C programs using POSIX threads. It
 | 
					 | 
				
			||||||
#   sets the PTHREAD_LIBS output variable to the threads library and linker
 | 
					 | 
				
			||||||
#   flags, and the PTHREAD_CFLAGS output variable to any special C compiler
 | 
					 | 
				
			||||||
#   flags that are needed. (The user can also force certain compiler
 | 
					 | 
				
			||||||
#   flags/libs to be tested by setting these environment variables.)
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Also sets PTHREAD_CC to any special C compiler that is needed for
 | 
					 | 
				
			||||||
#   multi-threaded programs (defaults to the value of CC otherwise). (This
 | 
					 | 
				
			||||||
#   is necessary on AIX to use the special cc_r compiler alias.)
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   NOTE: You are assumed to not only compile your program with these flags,
 | 
					 | 
				
			||||||
#   but also link it with them as well. e.g. you should link with
 | 
					 | 
				
			||||||
#   $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   If you are only building threads programs, you may wish to use these
 | 
					 | 
				
			||||||
#   variables in your default LIBS, CFLAGS, and CC:
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#     LIBS="$PTHREAD_LIBS $LIBS"
 | 
					 | 
				
			||||||
#     CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
 | 
					 | 
				
			||||||
#     CC="$PTHREAD_CC"
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
 | 
					 | 
				
			||||||
#   has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name
 | 
					 | 
				
			||||||
#   (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
 | 
					 | 
				
			||||||
#   PTHREAD_PRIO_INHERIT symbol is defined when compiling with
 | 
					 | 
				
			||||||
#   PTHREAD_CFLAGS.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   ACTION-IF-FOUND is a list of shell commands to run if a threads library
 | 
					 | 
				
			||||||
#   is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
 | 
					 | 
				
			||||||
#   is not found. If ACTION-IF-FOUND is not specified, the default action
 | 
					 | 
				
			||||||
#   will define HAVE_PTHREAD.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Please let the authors know if this macro fails on any platform, or if
 | 
					 | 
				
			||||||
#   you have any other suggestions or comments. This macro was based on work
 | 
					 | 
				
			||||||
#   by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
 | 
					 | 
				
			||||||
#   from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
 | 
					 | 
				
			||||||
#   Alejandro Forero Cuervo to the autoconf macro repository. We are also
 | 
					 | 
				
			||||||
#   grateful for the helpful feedback of numerous users.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Updated for Autoconf 2.68 by Daniel Richard G.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# LICENSE
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
 | 
					 | 
				
			||||||
#   Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   This program is free software: you can redistribute it and/or modify it
 | 
					 | 
				
			||||||
#   under the terms of the GNU General Public License as published by the
 | 
					 | 
				
			||||||
#   Free Software Foundation, either version 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 <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   As a special exception, the respective Autoconf Macro's copyright owner
 | 
					 | 
				
			||||||
#   gives unlimited permission to copy, distribute and modify the configure
 | 
					 | 
				
			||||||
#   scripts that are the output of Autoconf when processing the Macro. You
 | 
					 | 
				
			||||||
#   need not follow the terms of the GNU General Public License when using
 | 
					 | 
				
			||||||
#   or distributing such scripts, even though portions of the text of the
 | 
					 | 
				
			||||||
#   Macro appear in them. The GNU General Public License (GPL) does govern
 | 
					 | 
				
			||||||
#   all other use of the material that constitutes the Autoconf Macro.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   This special exception to the GPL applies to versions of the Autoconf
 | 
					 | 
				
			||||||
#   Macro released by the Autoconf Archive. When you make and distribute a
 | 
					 | 
				
			||||||
#   modified version of the Autoconf Macro, you may extend this special
 | 
					 | 
				
			||||||
#   exception to the GPL to apply to your modified version as well.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#serial 20
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
 | 
					 | 
				
			||||||
AC_DEFUN([AX_PTHREAD], [
 | 
					 | 
				
			||||||
AC_REQUIRE([AC_CANONICAL_HOST])
 | 
					 | 
				
			||||||
AC_LANG_PUSH([C])
 | 
					 | 
				
			||||||
ax_pthread_ok=no
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# We used to check for pthread.h first, but this fails if pthread.h
 | 
					 | 
				
			||||||
# requires special compiler flags (e.g. on True64 or Sequent).
 | 
					 | 
				
			||||||
# It gets checked for in the link test anyway.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# First of all, check if the user has set any of the PTHREAD_LIBS,
 | 
					 | 
				
			||||||
# etcetera environment variables, and if threads linking works using
 | 
					 | 
				
			||||||
# them:
 | 
					 | 
				
			||||||
if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
 | 
					 | 
				
			||||||
        save_CFLAGS="$CFLAGS"
 | 
					 | 
				
			||||||
        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
 | 
					 | 
				
			||||||
        save_LIBS="$LIBS"
 | 
					 | 
				
			||||||
        LIBS="$PTHREAD_LIBS $LIBS"
 | 
					 | 
				
			||||||
        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
 | 
					 | 
				
			||||||
        AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes)
 | 
					 | 
				
			||||||
        AC_MSG_RESULT($ax_pthread_ok)
 | 
					 | 
				
			||||||
        if test x"$ax_pthread_ok" = xno; then
 | 
					 | 
				
			||||||
                PTHREAD_LIBS=""
 | 
					 | 
				
			||||||
                PTHREAD_CFLAGS=""
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
        LIBS="$save_LIBS"
 | 
					 | 
				
			||||||
        CFLAGS="$save_CFLAGS"
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# We must check for the threads library under a number of different
 | 
					 | 
				
			||||||
# names; the ordering is very important because some systems
 | 
					 | 
				
			||||||
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
 | 
					 | 
				
			||||||
# libraries is broken (non-POSIX).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Create a list of thread flags to try.  Items starting with a "-" are
 | 
					 | 
				
			||||||
# C compiler flags, and other items are library names, except for "none"
 | 
					 | 
				
			||||||
# which indicates that we try without any flags at all, and "pthread-config"
 | 
					 | 
				
			||||||
# which is a program returning the flags for the Pth emulation library.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# The ordering *is* (sometimes) important.  Some notes on the
 | 
					 | 
				
			||||||
# individual items follow:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# pthreads: AIX (must check this before -lpthread)
 | 
					 | 
				
			||||||
# none: in case threads are in libc; should be tried before -Kthread and
 | 
					 | 
				
			||||||
#       other compiler flags to prevent continual compiler warnings
 | 
					 | 
				
			||||||
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
 | 
					 | 
				
			||||||
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
 | 
					 | 
				
			||||||
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
 | 
					 | 
				
			||||||
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
 | 
					 | 
				
			||||||
# -pthreads: Solaris/gcc
 | 
					 | 
				
			||||||
# -mthreads: Mingw32/gcc, Lynx/gcc
 | 
					 | 
				
			||||||
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
 | 
					 | 
				
			||||||
#      doesn't hurt to check since this sometimes defines pthreads too;
 | 
					 | 
				
			||||||
#      also defines -D_REENTRANT)
 | 
					 | 
				
			||||||
#      ... -mt is also the pthreads flag for HP/aCC
 | 
					 | 
				
			||||||
# pthread: Linux, etcetera
 | 
					 | 
				
			||||||
# --thread-safe: KAI C++
 | 
					 | 
				
			||||||
# pthread-config: use pthread-config program (for GNU Pth library)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
case ${host_os} in
 | 
					 | 
				
			||||||
        solaris*)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # On Solaris (at least, for some versions), libc contains stubbed
 | 
					 | 
				
			||||||
        # (non-functional) versions of the pthreads routines, so link-based
 | 
					 | 
				
			||||||
        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/
 | 
					 | 
				
			||||||
        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
 | 
					 | 
				
			||||||
        # a function called by this macro, so we could check for that, but
 | 
					 | 
				
			||||||
        # who knows whether they'll stub that too in a future libc.)  So,
 | 
					 | 
				
			||||||
        # we'll just look for -pthreads and -lpthread first:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        darwin*)
 | 
					 | 
				
			||||||
        ax_pthread_flags="-pthread $ax_pthread_flags"
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
esac
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if test x"$ax_pthread_ok" = xno; then
 | 
					 | 
				
			||||||
for flag in $ax_pthread_flags; do
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case $flag in
 | 
					 | 
				
			||||||
                none)
 | 
					 | 
				
			||||||
                AC_MSG_CHECKING([whether pthreads work without any flags])
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                -*)
 | 
					 | 
				
			||||||
                AC_MSG_CHECKING([whether pthreads work with $flag])
 | 
					 | 
				
			||||||
                PTHREAD_CFLAGS="$flag"
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                pthread-config)
 | 
					 | 
				
			||||||
                AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no)
 | 
					 | 
				
			||||||
                if test x"$ax_pthread_config" = xno; then continue; fi
 | 
					 | 
				
			||||||
                PTHREAD_CFLAGS="`pthread-config --cflags`"
 | 
					 | 
				
			||||||
                PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                *)
 | 
					 | 
				
			||||||
                AC_MSG_CHECKING([for the pthreads library -l$flag])
 | 
					 | 
				
			||||||
                PTHREAD_LIBS="-l$flag"
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
        esac
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        save_LIBS="$LIBS"
 | 
					 | 
				
			||||||
        save_CFLAGS="$CFLAGS"
 | 
					 | 
				
			||||||
        LIBS="$PTHREAD_LIBS $LIBS"
 | 
					 | 
				
			||||||
        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # Check for various functions.  We must include pthread.h,
 | 
					 | 
				
			||||||
        # since some functions may be macros.  (On the Sequent, we
 | 
					 | 
				
			||||||
        # need a special flag -Kthread to make this header compile.)
 | 
					 | 
				
			||||||
        # We check for pthread_join because it is in -lpthread on IRIX
 | 
					 | 
				
			||||||
        # while pthread_create is in libc.  We check for pthread_attr_init
 | 
					 | 
				
			||||||
        # due to DEC craziness with -lpthreads.  We check for
 | 
					 | 
				
			||||||
        # pthread_cleanup_push because it is one of the few pthread
 | 
					 | 
				
			||||||
        # functions on Solaris that doesn't have a non-functional libc stub.
 | 
					 | 
				
			||||||
        # We try pthread_create on general principles.
 | 
					 | 
				
			||||||
        AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
 | 
					 | 
				
			||||||
                        static void routine(void *a) { a = 0; }
 | 
					 | 
				
			||||||
                        static void *start_routine(void *a) { return a; }],
 | 
					 | 
				
			||||||
                       [pthread_t th; pthread_attr_t attr;
 | 
					 | 
				
			||||||
                        pthread_create(&th, 0, start_routine, 0);
 | 
					 | 
				
			||||||
                        pthread_join(th, 0);
 | 
					 | 
				
			||||||
                        pthread_attr_init(&attr);
 | 
					 | 
				
			||||||
                        pthread_cleanup_push(routine, 0);
 | 
					 | 
				
			||||||
                        pthread_cleanup_pop(0) /* ; */])],
 | 
					 | 
				
			||||||
                [ax_pthread_ok=yes],
 | 
					 | 
				
			||||||
                [])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        LIBS="$save_LIBS"
 | 
					 | 
				
			||||||
        CFLAGS="$save_CFLAGS"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        AC_MSG_RESULT($ax_pthread_ok)
 | 
					 | 
				
			||||||
        if test "x$ax_pthread_ok" = xyes; then
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        PTHREAD_LIBS=""
 | 
					 | 
				
			||||||
        PTHREAD_CFLAGS=""
 | 
					 | 
				
			||||||
done
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Various other checks:
 | 
					 | 
				
			||||||
if test "x$ax_pthread_ok" = xyes; then
 | 
					 | 
				
			||||||
        save_LIBS="$LIBS"
 | 
					 | 
				
			||||||
        LIBS="$PTHREAD_LIBS $LIBS"
 | 
					 | 
				
			||||||
        save_CFLAGS="$CFLAGS"
 | 
					 | 
				
			||||||
        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
 | 
					 | 
				
			||||||
        AC_MSG_CHECKING([for joinable pthread attribute])
 | 
					 | 
				
			||||||
        attr_name=unknown
 | 
					 | 
				
			||||||
        for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
 | 
					 | 
				
			||||||
            AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
 | 
					 | 
				
			||||||
                           [int attr = $attr; return attr /* ; */])],
 | 
					 | 
				
			||||||
                [attr_name=$attr; break],
 | 
					 | 
				
			||||||
                [])
 | 
					 | 
				
			||||||
        done
 | 
					 | 
				
			||||||
        AC_MSG_RESULT($attr_name)
 | 
					 | 
				
			||||||
        if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
 | 
					 | 
				
			||||||
            AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
 | 
					 | 
				
			||||||
                               [Define to necessary symbol if this constant
 | 
					 | 
				
			||||||
                                uses a non-standard name on your system.])
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        AC_MSG_CHECKING([if more special flags are required for pthreads])
 | 
					 | 
				
			||||||
        flag=no
 | 
					 | 
				
			||||||
        case ${host_os} in
 | 
					 | 
				
			||||||
            aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
 | 
					 | 
				
			||||||
            osf* | hpux*) flag="-D_REENTRANT";;
 | 
					 | 
				
			||||||
            solaris*)
 | 
					 | 
				
			||||||
            if test "$GCC" = "yes"; then
 | 
					 | 
				
			||||||
                flag="-D_REENTRANT"
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                flag="-mt -D_REENTRANT"
 | 
					 | 
				
			||||||
            fi
 | 
					 | 
				
			||||||
            ;;
 | 
					 | 
				
			||||||
        esac
 | 
					 | 
				
			||||||
        AC_MSG_RESULT(${flag})
 | 
					 | 
				
			||||||
        if test "x$flag" != xno; then
 | 
					 | 
				
			||||||
            PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
 | 
					 | 
				
			||||||
            ax_cv_PTHREAD_PRIO_INHERIT, [
 | 
					 | 
				
			||||||
                AC_LINK_IFELSE([
 | 
					 | 
				
			||||||
                    AC_LANG_PROGRAM([[#include <pthread.h>]], [[int i = PTHREAD_PRIO_INHERIT;]])],
 | 
					 | 
				
			||||||
                    [ax_cv_PTHREAD_PRIO_INHERIT=yes],
 | 
					 | 
				
			||||||
                    [ax_cv_PTHREAD_PRIO_INHERIT=no])
 | 
					 | 
				
			||||||
            ])
 | 
					 | 
				
			||||||
        AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"],
 | 
					 | 
				
			||||||
            AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], 1, [Have PTHREAD_PRIO_INHERIT.]))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        LIBS="$save_LIBS"
 | 
					 | 
				
			||||||
        CFLAGS="$save_CFLAGS"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # More AIX lossage: compile with *_r variant
 | 
					 | 
				
			||||||
        if test "x$GCC" != xyes; then
 | 
					 | 
				
			||||||
            case $host_os in
 | 
					 | 
				
			||||||
                aix*)
 | 
					 | 
				
			||||||
                AS_CASE(["x/$CC"],
 | 
					 | 
				
			||||||
                  [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
 | 
					 | 
				
			||||||
                  [#handle absolute path differently from PATH based program lookup
 | 
					 | 
				
			||||||
                   AS_CASE(["x$CC"],
 | 
					 | 
				
			||||||
                     [x/*],
 | 
					 | 
				
			||||||
                     [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
 | 
					 | 
				
			||||||
                     [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
            esac
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_SUBST(PTHREAD_LIBS)
 | 
					 | 
				
			||||||
AC_SUBST(PTHREAD_CFLAGS)
 | 
					 | 
				
			||||||
AC_SUBST(PTHREAD_CC)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
 | 
					 | 
				
			||||||
if test x"$ax_pthread_ok" = xyes; then
 | 
					 | 
				
			||||||
        ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
 | 
					 | 
				
			||||||
        :
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
        ax_pthread_ok=no
 | 
					 | 
				
			||||||
        $2
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
AC_LANG_POP
 | 
					 | 
				
			||||||
])dnl AX_PTHREAD
 | 
					 | 
				
			||||||
							
								
								
									
										76
									
								
								m4/ax_tls.m4
									
										
									
									
									
								
							
							
						
						
									
										76
									
								
								m4/ax_tls.m4
									
										
									
									
									
								
							| 
						 | 
					@ -1,76 +0,0 @@
 | 
				
			||||||
# ===========================================================================
 | 
					 | 
				
			||||||
#          http://www.gnu.org/software/autoconf-archive/ax_tls.html
 | 
					 | 
				
			||||||
# ===========================================================================
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# SYNOPSIS
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   AX_TLS([action-if-found], [action-if-not-found])
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# DESCRIPTION
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Provides a test for the compiler support of thread local storage (TLS)
 | 
					 | 
				
			||||||
#   extensions. Defines TLS if it is found. Currently knows about GCC/ICC
 | 
					 | 
				
			||||||
#   and MSVC. I think SunPro uses the same as GCC, and Borland apparently
 | 
					 | 
				
			||||||
#   supports either.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# LICENSE
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   Copyright (c) 2008 Alan Woodland <ajw05@aber.ac.uk>
 | 
					 | 
				
			||||||
#   Copyright (c) 2010 Diego Elio Petteno` <flameeyes@gmail.com>
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   This program is free software: you can 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 <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   As a special exception, the respective Autoconf Macro's copyright owner
 | 
					 | 
				
			||||||
#   gives unlimited permission to copy, distribute and modify the configure
 | 
					 | 
				
			||||||
#   scripts that are the output of Autoconf when processing the Macro. You
 | 
					 | 
				
			||||||
#   need not follow the terms of the GNU General Public License when using
 | 
					 | 
				
			||||||
#   or distributing such scripts, even though portions of the text of the
 | 
					 | 
				
			||||||
#   Macro appear in them. The GNU General Public License (GPL) does govern
 | 
					 | 
				
			||||||
#   all other use of the material that constitutes the Autoconf Macro.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#   This special exception to the GPL applies to versions of the Autoconf
 | 
					 | 
				
			||||||
#   Macro released by the Autoconf Archive. When you make and distribute a
 | 
					 | 
				
			||||||
#   modified version of the Autoconf Macro, you may extend this special
 | 
					 | 
				
			||||||
#   exception to the GPL to apply to your modified version as well.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#serial 10
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_DEFUN([AX_TLS], [
 | 
					 | 
				
			||||||
  AC_MSG_CHECKING(for thread local storage (TLS) class)
 | 
					 | 
				
			||||||
  AC_CACHE_VAL(ac_cv_tls, [
 | 
					 | 
				
			||||||
    ax_tls_keywords="__thread __declspec(thread) none"
 | 
					 | 
				
			||||||
    for ax_tls_keyword in $ax_tls_keywords; do
 | 
					 | 
				
			||||||
       AS_CASE([$ax_tls_keyword],
 | 
					 | 
				
			||||||
          [none], [ac_cv_tls=none ; break],
 | 
					 | 
				
			||||||
          [AC_TRY_COMPILE(
 | 
					 | 
				
			||||||
              [#include <stdlib.h>
 | 
					 | 
				
			||||||
               static void
 | 
					 | 
				
			||||||
               foo(void) {
 | 
					 | 
				
			||||||
               static ] $ax_tls_keyword [ int bar;
 | 
					 | 
				
			||||||
               exit(1);
 | 
					 | 
				
			||||||
               }],
 | 
					 | 
				
			||||||
               [],
 | 
					 | 
				
			||||||
               [ac_cv_tls=$ax_tls_keyword ; break],
 | 
					 | 
				
			||||||
               ac_cv_tls=none
 | 
					 | 
				
			||||||
           )])
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
  ])
 | 
					 | 
				
			||||||
  AC_MSG_RESULT($ac_cv_tls)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  AS_IF([test "$ac_cv_tls" != "none"],
 | 
					 | 
				
			||||||
    AC_DEFINE_UNQUOTED([TLS], $ac_cv_tls, [If the compiler supports a TLS storage class define it to that here])
 | 
					 | 
				
			||||||
      m4_ifnblank([$1], [$1]),
 | 
					 | 
				
			||||||
    m4_ifnblank([$2], [$2])
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
])
 | 
					 | 
				
			||||||
							
								
								
									
										69
									
								
								m4/orc.m4
									
										
									
									
									
								
							
							
						
						
									
										69
									
								
								m4/orc.m4
									
										
									
									
									
								
							| 
						 | 
					@ -1,69 +0,0 @@
 | 
				
			||||||
dnl pkg-config-based checks for Orc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl specific:
 | 
					 | 
				
			||||||
dnl ORC_CHECK([REQUIRED_VERSION])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_DEFUN([ORC_CHECK],
 | 
					 | 
				
			||||||
[
 | 
					 | 
				
			||||||
  ORC_REQ=ifelse([$1], , "0.4.6", [$1])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  AC_ARG_ENABLE(orc,
 | 
					 | 
				
			||||||
  AC_HELP_STRING([--enable-orc],[use Orc if installed]),
 | 
					 | 
				
			||||||
  [case "${enableval}" in
 | 
					 | 
				
			||||||
    auto) enable_orc=auto ;;
 | 
					 | 
				
			||||||
    yes) enable_orc=yes ;;
 | 
					 | 
				
			||||||
    no)  enable_orc=no ;;
 | 
					 | 
				
			||||||
    *) AC_MSG_ERROR(bad value ${enableval} for --enable-orc) ;;
 | 
					 | 
				
			||||||
  esac
 | 
					 | 
				
			||||||
  ],
 | 
					 | 
				
			||||||
  [enable_orc=auto]) dnl Default value
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if test "x$enable_orc" != "xno" ; then
 | 
					 | 
				
			||||||
    PKG_CHECK_MODULES(ORC, orc-0.4 >= $ORC_REQ, [
 | 
					 | 
				
			||||||
      AC_DEFINE(HAVE_ORC, 1, [Use Orc])
 | 
					 | 
				
			||||||
      HAVE_ORC=yes
 | 
					 | 
				
			||||||
      if test "x$ORCC" = "x" ; then
 | 
					 | 
				
			||||||
        AC_MSG_CHECKING(for usable orcc)
 | 
					 | 
				
			||||||
        ORCC=`$PKG_CONFIG --variable=orcc orc-0.4`
 | 
					 | 
				
			||||||
        dnl check whether the orcc found by pkg-config can be run from the build environment
 | 
					 | 
				
			||||||
        dnl if this is not the case (e.g. when cross-compiling) fall back to orcc from PATH
 | 
					 | 
				
			||||||
        AS_IF([$ORCC --version 1> /dev/null 2> /dev/null], [], [ORCC=`which orcc`])
 | 
					 | 
				
			||||||
        AC_MSG_RESULT($ORCC)
 | 
					 | 
				
			||||||
      fi
 | 
					 | 
				
			||||||
      AC_SUBST(ORCC)
 | 
					 | 
				
			||||||
      ORCC_FLAGS="--compat $ORC_REQ"
 | 
					 | 
				
			||||||
      AC_SUBST(ORCC_FLAGS)
 | 
					 | 
				
			||||||
      AS_IF([test "x$ORCC" = "x"], [HAVE_ORCC=no], [HAVE_ORCC=yes])
 | 
					 | 
				
			||||||
    ], [
 | 
					 | 
				
			||||||
      if test "x$enable_orc" = "xyes" ; then
 | 
					 | 
				
			||||||
        AC_MSG_ERROR([--enable-orc specified, but Orc >= $ORC_REQ not found])
 | 
					 | 
				
			||||||
      fi
 | 
					 | 
				
			||||||
      AC_DEFINE(DISABLE_ORC, 1, [Disable Orc])
 | 
					 | 
				
			||||||
      HAVE_ORC=no
 | 
					 | 
				
			||||||
      HAVE_ORCC=no
 | 
					 | 
				
			||||||
    ])
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    AC_DEFINE(DISABLE_ORC, 1, [Disable Orc])
 | 
					 | 
				
			||||||
    HAVE_ORC=no
 | 
					 | 
				
			||||||
    HAVE_ORCC=no
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
  AM_CONDITIONAL(HAVE_ORC, [test "x$HAVE_ORC" = "xyes"])
 | 
					 | 
				
			||||||
  AM_CONDITIONAL(HAVE_ORCC, [test "x$HAVE_ORCC" = "xyes"])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
]))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_DEFUN([ORC_OUTPUT],
 | 
					 | 
				
			||||||
[
 | 
					 | 
				
			||||||
  if test "$HAVE_ORC" = yes ; then
 | 
					 | 
				
			||||||
    printf "configure: *** Orc acceleration enabled.\n"
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    if test "x$enable_orc" = "xno" ; then
 | 
					 | 
				
			||||||
      printf "configure: *** Orc acceleration disabled by --disable-orc.  Slower code paths\n"
 | 
					 | 
				
			||||||
      printf "               will be used.\n"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      printf "configure: *** Orc acceleration disabled.  Requires Orc >= $ORC_REQ, which was\n"
 | 
					 | 
				
			||||||
      printf "               not found.  Slower code paths will be used.\n"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
  printf "\n"
 | 
					 | 
				
			||||||
])
 | 
					 | 
				
			||||||
							
								
								
									
										102
									
								
								man/Makefile.am
									
										
									
									
									
								
							
							
						
						
									
										102
									
								
								man/Makefile.am
									
										
									
									
									
								
							| 
						 | 
					@ -1,102 +0,0 @@
 | 
				
			||||||
# This file is part of PulseAudio.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# PulseAudio is free software; you can redistribute it and/or modify
 | 
					 | 
				
			||||||
# it under the terms of the GNU Lesser General Public License as published by
 | 
					 | 
				
			||||||
# the Free Software Foundation; either version 2 of the License, or
 | 
					 | 
				
			||||||
# (at your option) any later version.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# PulseAudio is distributed in the hope that it will be useful, but
 | 
					 | 
				
			||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | 
					 | 
				
			||||||
# General Public License for more details.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DISTCLEANFILES = \
 | 
					 | 
				
			||||||
	$(noinst_DATA)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
noinst_DATA = \
 | 
					 | 
				
			||||||
	pulseaudio.1.xml \
 | 
					 | 
				
			||||||
	pax11publish.1.xml \
 | 
					 | 
				
			||||||
	pacat.1.xml \
 | 
					 | 
				
			||||||
	pacmd.1.xml \
 | 
					 | 
				
			||||||
	pactl.1.xml \
 | 
					 | 
				
			||||||
	pasuspender.1.xml \
 | 
					 | 
				
			||||||
	padsp.1.xml \
 | 
					 | 
				
			||||||
	pulse-daemon.conf.5.xml \
 | 
					 | 
				
			||||||
	pulse-client.conf.5.xml \
 | 
					 | 
				
			||||||
	default.pa.5.xml \
 | 
					 | 
				
			||||||
	pulse-cli-syntax.5.xml \
 | 
					 | 
				
			||||||
	start-pulseaudio-x11.1.xml
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if HAVE_ESOUND
 | 
					 | 
				
			||||||
noinst_DATA += esdcompat.1.xml
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
xmllint: $(noinst_DATA)
 | 
					 | 
				
			||||||
	for f in $(noinst_DATA) ; do \
 | 
					 | 
				
			||||||
			xmllint --noout --valid "$$f" || exit 1 ; \
 | 
					 | 
				
			||||||
	done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if BUILD_MANPAGES
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dist_man_MANS = \
 | 
					 | 
				
			||||||
	pulseaudio.1 \
 | 
					 | 
				
			||||||
	pax11publish.1 \
 | 
					 | 
				
			||||||
	pacat.1 \
 | 
					 | 
				
			||||||
	pacmd.1 \
 | 
					 | 
				
			||||||
	pactl.1 \
 | 
					 | 
				
			||||||
	pasuspender.1 \
 | 
					 | 
				
			||||||
	padsp.1 \
 | 
					 | 
				
			||||||
	pulse-daemon.conf.5 \
 | 
					 | 
				
			||||||
	pulse-client.conf.5 \
 | 
					 | 
				
			||||||
	default.pa.5 \
 | 
					 | 
				
			||||||
	pulse-cli-syntax.5 \
 | 
					 | 
				
			||||||
	start-pulseaudio-x11.1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if HAVE_ESOUND
 | 
					 | 
				
			||||||
dist_man_MANS += esdcompat.1
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
CLEANFILES = \
 | 
					 | 
				
			||||||
	$(dist_man_MANS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%: %.xml Makefile
 | 
					 | 
				
			||||||
	$(AM_V_GEN) perl $(srcdir)/xmltoman $< > $@ || rm -f $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if OS_IS_WIN32
 | 
					 | 
				
			||||||
SYMLINK_PROGRAM=cd $(DESTDIR)$(man1dir) && cp
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
SYMLINK_PROGRAM=ln -sf
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
install-data-hook:
 | 
					 | 
				
			||||||
	$(SYMLINK_PROGRAM) pacat.1 $(DESTDIR)$(man1dir)/paplay.1
 | 
					 | 
				
			||||||
	$(SYMLINK_PROGRAM) pacat.1 $(DESTDIR)$(man1dir)/parec.1
 | 
					 | 
				
			||||||
	$(SYMLINK_PROGRAM) pacat.1 $(DESTDIR)$(man1dir)/parecord.1
 | 
					 | 
				
			||||||
	$(SYMLINK_PROGRAM) pacat.1 $(DESTDIR)$(man1dir)/pamon.1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall-hook:
 | 
					 | 
				
			||||||
	rm -f $(DESTDIR)$(man1dir)/paplay.1
 | 
					 | 
				
			||||||
	rm -f $(DESTDIR)$(man1dir)/parec.1
 | 
					 | 
				
			||||||
	rm -f $(DESTDIR)$(man1dir)/parecord.1
 | 
					 | 
				
			||||||
	rm -f $(DESTDIR)$(man1dir)/pamon.1
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
EXTRA_DIST = \
 | 
					 | 
				
			||||||
	pulseaudio.1.xml.in \
 | 
					 | 
				
			||||||
	esdcompat.1.xml.in \
 | 
					 | 
				
			||||||
	pax11publish.1.xml.in \
 | 
					 | 
				
			||||||
	pacat.1.xml.in \
 | 
					 | 
				
			||||||
	pacmd.1.xml.in \
 | 
					 | 
				
			||||||
	pactl.1.xml.in \
 | 
					 | 
				
			||||||
	pasuspender.1.xml.in \
 | 
					 | 
				
			||||||
	padsp.1.xml.in \
 | 
					 | 
				
			||||||
	pulse-daemon.conf.5.xml.in \
 | 
					 | 
				
			||||||
	pulse-client.conf.5.xml.in \
 | 
					 | 
				
			||||||
	default.pa.5.xml.in \
 | 
					 | 
				
			||||||
	pulse-cli-syntax.5.xml.in \
 | 
					 | 
				
			||||||
	start-pulseaudio-x11.1.xml.in \
 | 
					 | 
				
			||||||
	xmltoman \
 | 
					 | 
				
			||||||
	xmltoman.css \
 | 
					 | 
				
			||||||
	xmltoman.xsl \
 | 
					 | 
				
			||||||
	xmltoman.dtd
 | 
					 | 
				
			||||||
							
								
								
									
										48
									
								
								orc.mak
									
										
									
									
									
								
							
							
						
						
									
										48
									
								
								orc.mak
									
										
									
									
									
								
							| 
						 | 
					@ -1,48 +0,0 @@
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# This is a Makefile.am fragment to build Orc code. It is based
 | 
					 | 
				
			||||||
# on the orc.mak file distributed in the GStreamer common
 | 
					 | 
				
			||||||
# repository.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Include this file like this:
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#  include $(top_srcdir)/orc.mak
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# For each Orc source file, append its name (without the extension)
 | 
					 | 
				
			||||||
# to ORC_SOURCE:
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#  ORC_SOURCE += gstadderorc
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# This will create gstadder-orc-gen.c and gstadder-orc-gen.h, which
 | 
					 | 
				
			||||||
# you need to add to your nodist_module_SOURCES.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Note that this file appends to BUILT_SOURCES and CLEANFILES, so
 | 
					 | 
				
			||||||
# define them before including this file.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
EXTRA_DIST += $(addsuffix .orc,$(ORC_SOURCE))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if HAVE_ORC
 | 
					 | 
				
			||||||
ORC_BUILT_SOURCE = $(addsuffix -orc-gen.c,$(ORC_SOURCE))
 | 
					 | 
				
			||||||
ORC_BUILT_HEADER = $(addsuffix -orc-gen.h,$(ORC_SOURCE))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
BUILT_SOURCES += $(ORC_BUILT_SOURCE) $(ORC_BUILT_HEADER)
 | 
					 | 
				
			||||||
CLEANFILES += $(BUILT_SOURCES)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
orcc_v_gen = $(orcc_v_gen_$(V))
 | 
					 | 
				
			||||||
orcc_v_gen_ = $(orcc_v_gen_$(AM_DEFAULT_VERBOSITY))
 | 
					 | 
				
			||||||
orcc_v_gen_0 = @echo "  ORCC   $@";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cp_v_gen = $(cp_v_gen_$(V))
 | 
					 | 
				
			||||||
cp_v_gen_ = $(cp_v_gen_$(AM_DEFAULT_VERBOSITY))
 | 
					 | 
				
			||||||
cp_v_gen_0 = @echo "  CP     $@";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%-orc-gen.c: %.orc
 | 
					 | 
				
			||||||
	@mkdir -p $(@D)
 | 
					 | 
				
			||||||
	$(orcc_v_gen)$(ORCC) --implementation -o $@ $<
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%-orc-gen.h: %.orc
 | 
					 | 
				
			||||||
	@mkdir -p $(@D)
 | 
					 | 
				
			||||||
	$(orcc_v_gen)$(ORCC) --header -o $@ $<
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
							
								
								
									
										3
									
								
								src/.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								src/.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -14,7 +14,6 @@ daemon.conf
 | 
				
			||||||
default.pa
 | 
					default.pa
 | 
				
			||||||
echo-cancel-test
 | 
					echo-cancel-test
 | 
				
			||||||
esdcompat
 | 
					esdcompat
 | 
				
			||||||
gconf-helper
 | 
					 | 
				
			||||||
gsettings-helper
 | 
					gsettings-helper
 | 
				
			||||||
org.freedesktop.pulseaudio.gschema.valid
 | 
					org.freedesktop.pulseaudio.gschema.valid
 | 
				
			||||||
pacat
 | 
					pacat
 | 
				
			||||||
| 
						 | 
					@ -26,6 +25,7 @@ pasuspender
 | 
				
			||||||
pax11publish
 | 
					pax11publish
 | 
				
			||||||
pulseaudio
 | 
					pulseaudio
 | 
				
			||||||
pulseaudio.service
 | 
					pulseaudio.service
 | 
				
			||||||
 | 
					pulseaudio-x11.service
 | 
				
			||||||
start-pulseaudio-x11
 | 
					start-pulseaudio-x11
 | 
				
			||||||
*-orc-gen.[ch]
 | 
					*-orc-gen.[ch]
 | 
				
			||||||
# tests
 | 
					# tests
 | 
				
			||||||
| 
						 | 
					@ -49,6 +49,7 @@ flist-test
 | 
				
			||||||
format-test
 | 
					format-test
 | 
				
			||||||
get-binary-name-test
 | 
					get-binary-name-test
 | 
				
			||||||
gtk-test
 | 
					gtk-test
 | 
				
			||||||
 | 
					hashmap-test
 | 
				
			||||||
hook-list-test
 | 
					hook-list-test
 | 
				
			||||||
interpol-test
 | 
					interpol-test
 | 
				
			||||||
ipacl-test
 | 
					ipacl-test
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2309
									
								
								src/Makefile.am
									
										
									
									
									
								
							
							
						
						
									
										2309
									
								
								src/Makefile.am
									
										
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
					@ -1 +0,0 @@
 | 
				
			||||||
../modules/Makefile
 | 
					 | 
				
			||||||
							
								
								
									
										392
									
								
								src/map-file
									
										
									
									
									
								
							
							
						
						
									
										392
									
								
								src/map-file
									
										
									
									
									
								
							| 
						 | 
					@ -1,392 +0,0 @@
 | 
				
			||||||
PULSE_0 {
 | 
					 | 
				
			||||||
global:
 | 
					 | 
				
			||||||
pa_ascii_filter;
 | 
					 | 
				
			||||||
pa_ascii_valid;
 | 
					 | 
				
			||||||
pa_bytes_per_second;
 | 
					 | 
				
			||||||
pa_bytes_snprint;
 | 
					 | 
				
			||||||
pa_bytes_to_usec;
 | 
					 | 
				
			||||||
pa_channel_map_can_balance;
 | 
					 | 
				
			||||||
pa_channel_map_can_fade;
 | 
					 | 
				
			||||||
pa_channel_map_can_lfe_balance;
 | 
					 | 
				
			||||||
pa_channel_map_compatible;
 | 
					 | 
				
			||||||
pa_channel_map_equal;
 | 
					 | 
				
			||||||
pa_channel_map_has_position;
 | 
					 | 
				
			||||||
pa_channel_map_init;
 | 
					 | 
				
			||||||
pa_channel_map_init_auto;
 | 
					 | 
				
			||||||
pa_channel_map_init_extend;
 | 
					 | 
				
			||||||
pa_channel_map_init_mono;
 | 
					 | 
				
			||||||
pa_channel_map_init_stereo;
 | 
					 | 
				
			||||||
pa_channel_map_mask;
 | 
					 | 
				
			||||||
pa_channel_map_parse;
 | 
					 | 
				
			||||||
pa_channel_map_snprint;
 | 
					 | 
				
			||||||
pa_channel_map_superset;
 | 
					 | 
				
			||||||
pa_channel_map_to_name;
 | 
					 | 
				
			||||||
pa_channel_map_to_pretty_name;
 | 
					 | 
				
			||||||
pa_channel_map_valid;
 | 
					 | 
				
			||||||
pa_channel_position_from_string;
 | 
					 | 
				
			||||||
pa_channel_position_to_pretty_string;
 | 
					 | 
				
			||||||
pa_channel_position_to_string;
 | 
					 | 
				
			||||||
pa_channels_valid;
 | 
					 | 
				
			||||||
pa_context_add_autoload;
 | 
					 | 
				
			||||||
pa_context_connect;
 | 
					 | 
				
			||||||
pa_context_disconnect;
 | 
					 | 
				
			||||||
pa_context_drain;
 | 
					 | 
				
			||||||
pa_context_errno;
 | 
					 | 
				
			||||||
pa_context_exit_daemon;
 | 
					 | 
				
			||||||
pa_context_get_autoload_info_by_index;
 | 
					 | 
				
			||||||
pa_context_get_autoload_info_by_name;
 | 
					 | 
				
			||||||
pa_context_get_autoload_info_list;
 | 
					 | 
				
			||||||
pa_context_get_card_info_by_index;
 | 
					 | 
				
			||||||
pa_context_get_card_info_by_name;
 | 
					 | 
				
			||||||
pa_context_get_card_info_list;
 | 
					 | 
				
			||||||
pa_context_get_client_info;
 | 
					 | 
				
			||||||
pa_context_get_client_info_list;
 | 
					 | 
				
			||||||
pa_context_get_index;
 | 
					 | 
				
			||||||
pa_context_get_module_info;
 | 
					 | 
				
			||||||
pa_context_get_module_info_list;
 | 
					 | 
				
			||||||
pa_context_get_protocol_version;
 | 
					 | 
				
			||||||
pa_context_get_sample_info_by_index;
 | 
					 | 
				
			||||||
pa_context_get_sample_info_by_name;
 | 
					 | 
				
			||||||
pa_context_get_sample_info_list;
 | 
					 | 
				
			||||||
pa_context_get_server;
 | 
					 | 
				
			||||||
pa_context_get_server_info;
 | 
					 | 
				
			||||||
pa_context_get_server_protocol_version;
 | 
					 | 
				
			||||||
pa_context_get_sink_info_by_index;
 | 
					 | 
				
			||||||
pa_context_get_sink_info_by_name;
 | 
					 | 
				
			||||||
pa_context_get_sink_info_list;
 | 
					 | 
				
			||||||
pa_context_get_sink_input_info;
 | 
					 | 
				
			||||||
pa_context_get_sink_input_info_list;
 | 
					 | 
				
			||||||
pa_context_get_source_info_by_index;
 | 
					 | 
				
			||||||
pa_context_get_source_info_by_name;
 | 
					 | 
				
			||||||
pa_context_get_source_info_list;
 | 
					 | 
				
			||||||
pa_context_get_source_output_info;
 | 
					 | 
				
			||||||
pa_context_get_source_output_info_list;
 | 
					 | 
				
			||||||
pa_context_set_port_latency_offset;
 | 
					 | 
				
			||||||
pa_context_get_state;
 | 
					 | 
				
			||||||
pa_context_get_tile_size;
 | 
					 | 
				
			||||||
pa_context_is_local;
 | 
					 | 
				
			||||||
pa_context_is_pending;
 | 
					 | 
				
			||||||
pa_context_kill_client;
 | 
					 | 
				
			||||||
pa_context_kill_sink_input;
 | 
					 | 
				
			||||||
pa_context_kill_source_output;
 | 
					 | 
				
			||||||
pa_context_load_cookie_from_file;
 | 
					 | 
				
			||||||
pa_context_load_module;
 | 
					 | 
				
			||||||
pa_context_move_sink_input_by_index;
 | 
					 | 
				
			||||||
pa_context_move_sink_input_by_name;
 | 
					 | 
				
			||||||
pa_context_move_source_output_by_index;
 | 
					 | 
				
			||||||
pa_context_move_source_output_by_name;
 | 
					 | 
				
			||||||
pa_context_new;
 | 
					 | 
				
			||||||
pa_context_new_with_proplist;
 | 
					 | 
				
			||||||
pa_context_play_sample;
 | 
					 | 
				
			||||||
pa_context_play_sample_with_proplist;
 | 
					 | 
				
			||||||
pa_context_proplist_remove;
 | 
					 | 
				
			||||||
pa_context_proplist_update;
 | 
					 | 
				
			||||||
pa_context_ref;
 | 
					 | 
				
			||||||
pa_context_remove_autoload_by_index;
 | 
					 | 
				
			||||||
pa_context_remove_autoload_by_name;
 | 
					 | 
				
			||||||
pa_context_remove_sample;
 | 
					 | 
				
			||||||
pa_context_rttime_new;
 | 
					 | 
				
			||||||
pa_context_rttime_restart;
 | 
					 | 
				
			||||||
pa_context_set_card_profile_by_index;
 | 
					 | 
				
			||||||
pa_context_set_card_profile_by_name;
 | 
					 | 
				
			||||||
pa_context_set_default_sink;
 | 
					 | 
				
			||||||
pa_context_set_default_source;
 | 
					 | 
				
			||||||
pa_context_set_event_callback;
 | 
					 | 
				
			||||||
pa_context_set_name;
 | 
					 | 
				
			||||||
pa_context_set_sink_input_mute;
 | 
					 | 
				
			||||||
pa_context_set_sink_input_volume;
 | 
					 | 
				
			||||||
pa_context_set_sink_mute_by_index;
 | 
					 | 
				
			||||||
pa_context_set_sink_mute_by_name;
 | 
					 | 
				
			||||||
pa_context_set_sink_port_by_index;
 | 
					 | 
				
			||||||
pa_context_set_sink_port_by_name;
 | 
					 | 
				
			||||||
pa_context_set_sink_volume_by_index;
 | 
					 | 
				
			||||||
pa_context_set_sink_volume_by_name;
 | 
					 | 
				
			||||||
pa_context_set_source_output_mute;
 | 
					 | 
				
			||||||
pa_context_set_source_output_volume;
 | 
					 | 
				
			||||||
pa_context_set_source_mute_by_index;
 | 
					 | 
				
			||||||
pa_context_set_source_mute_by_name;
 | 
					 | 
				
			||||||
pa_context_set_source_port_by_index;
 | 
					 | 
				
			||||||
pa_context_set_source_port_by_name;
 | 
					 | 
				
			||||||
pa_context_set_source_volume_by_index;
 | 
					 | 
				
			||||||
pa_context_set_source_volume_by_name;
 | 
					 | 
				
			||||||
pa_context_set_state_callback;
 | 
					 | 
				
			||||||
pa_context_set_subscribe_callback;
 | 
					 | 
				
			||||||
pa_context_stat;
 | 
					 | 
				
			||||||
pa_context_subscribe;
 | 
					 | 
				
			||||||
pa_context_suspend_sink_by_index;
 | 
					 | 
				
			||||||
pa_context_suspend_sink_by_name;
 | 
					 | 
				
			||||||
pa_context_suspend_source_by_index;
 | 
					 | 
				
			||||||
pa_context_suspend_source_by_name;
 | 
					 | 
				
			||||||
pa_context_unload_module;
 | 
					 | 
				
			||||||
pa_context_unref;
 | 
					 | 
				
			||||||
pa_cvolume_avg;
 | 
					 | 
				
			||||||
pa_cvolume_avg_mask;
 | 
					 | 
				
			||||||
pa_cvolume_channels_equal_to;
 | 
					 | 
				
			||||||
pa_cvolume_compatible;
 | 
					 | 
				
			||||||
pa_cvolume_compatible_with_channel_map;
 | 
					 | 
				
			||||||
pa_cvolume_dec;
 | 
					 | 
				
			||||||
pa_cvolume_equal;
 | 
					 | 
				
			||||||
pa_cvolume_get_balance;
 | 
					 | 
				
			||||||
pa_cvolume_get_fade;
 | 
					 | 
				
			||||||
pa_cvolume_get_lfe_balance;
 | 
					 | 
				
			||||||
pa_cvolume_get_position;
 | 
					 | 
				
			||||||
pa_cvolume_inc;
 | 
					 | 
				
			||||||
pa_cvolume_inc_clamp;
 | 
					 | 
				
			||||||
pa_cvolume_init;
 | 
					 | 
				
			||||||
pa_cvolume_max;
 | 
					 | 
				
			||||||
pa_cvolume_max_mask;
 | 
					 | 
				
			||||||
pa_cvolume_merge;
 | 
					 | 
				
			||||||
pa_cvolume_min;
 | 
					 | 
				
			||||||
pa_cvolume_min_mask;
 | 
					 | 
				
			||||||
pa_cvolume_remap;
 | 
					 | 
				
			||||||
pa_cvolume_scale;
 | 
					 | 
				
			||||||
pa_cvolume_scale_mask;
 | 
					 | 
				
			||||||
pa_cvolume_set;
 | 
					 | 
				
			||||||
pa_cvolume_set_balance;
 | 
					 | 
				
			||||||
pa_cvolume_set_fade;
 | 
					 | 
				
			||||||
pa_cvolume_set_lfe_balance;
 | 
					 | 
				
			||||||
pa_cvolume_set_position;
 | 
					 | 
				
			||||||
pa_cvolume_snprint;
 | 
					 | 
				
			||||||
pa_cvolume_snprint_verbose;
 | 
					 | 
				
			||||||
pa_cvolume_valid;
 | 
					 | 
				
			||||||
pa_direction_to_string;
 | 
					 | 
				
			||||||
pa_direction_valid;
 | 
					 | 
				
			||||||
pa_encoding_from_string;
 | 
					 | 
				
			||||||
pa_encoding_to_string;
 | 
					 | 
				
			||||||
pa_ext_device_manager_delete;
 | 
					 | 
				
			||||||
pa_ext_device_manager_enable_role_device_priority_routing;
 | 
					 | 
				
			||||||
pa_ext_device_manager_read;
 | 
					 | 
				
			||||||
pa_ext_device_manager_reorder_devices_for_role;
 | 
					 | 
				
			||||||
pa_ext_device_manager_set_device_description;
 | 
					 | 
				
			||||||
pa_ext_device_manager_set_subscribe_cb;
 | 
					 | 
				
			||||||
pa_ext_device_manager_subscribe;
 | 
					 | 
				
			||||||
pa_ext_device_manager_test;
 | 
					 | 
				
			||||||
pa_ext_device_restore_read_formats;
 | 
					 | 
				
			||||||
pa_ext_device_restore_read_formats_all;
 | 
					 | 
				
			||||||
pa_ext_device_restore_save_formats;
 | 
					 | 
				
			||||||
pa_ext_device_restore_set_subscribe_cb;
 | 
					 | 
				
			||||||
pa_ext_device_restore_subscribe;
 | 
					 | 
				
			||||||
pa_ext_device_restore_test;
 | 
					 | 
				
			||||||
pa_ext_stream_restore_delete;
 | 
					 | 
				
			||||||
pa_ext_stream_restore_read;
 | 
					 | 
				
			||||||
pa_ext_stream_restore_set_subscribe_cb;
 | 
					 | 
				
			||||||
pa_ext_stream_restore_subscribe;
 | 
					 | 
				
			||||||
pa_ext_stream_restore_test;
 | 
					 | 
				
			||||||
pa_ext_stream_restore_write;
 | 
					 | 
				
			||||||
pa_format_info_copy;
 | 
					 | 
				
			||||||
pa_format_info_free;
 | 
					 | 
				
			||||||
pa_format_info_from_string;
 | 
					 | 
				
			||||||
pa_format_info_from_sample_spec;
 | 
					 | 
				
			||||||
pa_format_info_get_channel_map;
 | 
					 | 
				
			||||||
pa_format_info_get_channels;
 | 
					 | 
				
			||||||
pa_format_info_get_prop_type;
 | 
					 | 
				
			||||||
pa_format_info_get_prop_int;
 | 
					 | 
				
			||||||
pa_format_info_get_prop_int_range;
 | 
					 | 
				
			||||||
pa_format_info_get_prop_int_array;
 | 
					 | 
				
			||||||
pa_format_info_get_prop_string;
 | 
					 | 
				
			||||||
pa_format_info_get_prop_string_array;
 | 
					 | 
				
			||||||
pa_format_info_get_rate;
 | 
					 | 
				
			||||||
pa_format_info_get_sample_format;
 | 
					 | 
				
			||||||
pa_format_info_free_string_array;
 | 
					 | 
				
			||||||
pa_format_info_is_compatible;
 | 
					 | 
				
			||||||
pa_format_info_is_pcm;
 | 
					 | 
				
			||||||
pa_format_info_new;
 | 
					 | 
				
			||||||
pa_format_info_set_channel_map;
 | 
					 | 
				
			||||||
pa_format_info_set_channels;
 | 
					 | 
				
			||||||
pa_format_info_set_prop_int;
 | 
					 | 
				
			||||||
pa_format_info_set_prop_int_array;
 | 
					 | 
				
			||||||
pa_format_info_set_prop_int_range;
 | 
					 | 
				
			||||||
pa_format_info_set_prop_string;
 | 
					 | 
				
			||||||
pa_format_info_set_prop_string_array;
 | 
					 | 
				
			||||||
pa_format_info_set_rate;
 | 
					 | 
				
			||||||
pa_format_info_set_sample_format;
 | 
					 | 
				
			||||||
pa_format_info_snprint;
 | 
					 | 
				
			||||||
pa_format_info_to_sample_spec;
 | 
					 | 
				
			||||||
pa_format_info_valid;
 | 
					 | 
				
			||||||
pa_frame_size;
 | 
					 | 
				
			||||||
pa_get_binary_name;
 | 
					 | 
				
			||||||
pa_get_fqdn;
 | 
					 | 
				
			||||||
pa_get_home_dir;
 | 
					 | 
				
			||||||
pa_get_host_name;
 | 
					 | 
				
			||||||
pa_get_library_version;
 | 
					 | 
				
			||||||
pa_gettimeofday;
 | 
					 | 
				
			||||||
pa_get_user_name;
 | 
					 | 
				
			||||||
pa_glib_mainloop_free;
 | 
					 | 
				
			||||||
pa_glib_mainloop_get_api;
 | 
					 | 
				
			||||||
pa_glib_mainloop_new;
 | 
					 | 
				
			||||||
pa_locale_to_utf8;
 | 
					 | 
				
			||||||
pa_mainloop_api_once;
 | 
					 | 
				
			||||||
pa_mainloop_dispatch;
 | 
					 | 
				
			||||||
pa_mainloop_free;
 | 
					 | 
				
			||||||
pa_mainloop_get_api;
 | 
					 | 
				
			||||||
pa_mainloop_get_retval;
 | 
					 | 
				
			||||||
pa_mainloop_iterate;
 | 
					 | 
				
			||||||
pa_mainloop_new;
 | 
					 | 
				
			||||||
pa_mainloop_poll;
 | 
					 | 
				
			||||||
pa_mainloop_prepare;
 | 
					 | 
				
			||||||
pa_mainloop_quit;
 | 
					 | 
				
			||||||
pa_mainloop_run;
 | 
					 | 
				
			||||||
pa_mainloop_set_poll_func;
 | 
					 | 
				
			||||||
pa_mainloop_wakeup;
 | 
					 | 
				
			||||||
pa_msleep;
 | 
					 | 
				
			||||||
pa_thread_make_realtime;
 | 
					 | 
				
			||||||
pa_operation_cancel;
 | 
					 | 
				
			||||||
pa_operation_get_state;
 | 
					 | 
				
			||||||
pa_operation_ref;
 | 
					 | 
				
			||||||
pa_operation_set_state_callback;
 | 
					 | 
				
			||||||
pa_operation_unref;
 | 
					 | 
				
			||||||
pa_parse_sample_format;
 | 
					 | 
				
			||||||
pa_path_get_filename;
 | 
					 | 
				
			||||||
pa_proplist_clear;
 | 
					 | 
				
			||||||
pa_proplist_contains;
 | 
					 | 
				
			||||||
pa_proplist_copy;
 | 
					 | 
				
			||||||
pa_proplist_equal;
 | 
					 | 
				
			||||||
pa_proplist_free;
 | 
					 | 
				
			||||||
pa_proplist_from_string;
 | 
					 | 
				
			||||||
pa_proplist_get;
 | 
					 | 
				
			||||||
pa_proplist_gets;
 | 
					 | 
				
			||||||
pa_proplist_isempty;
 | 
					 | 
				
			||||||
pa_proplist_iterate;
 | 
					 | 
				
			||||||
pa_proplist_key_valid;
 | 
					 | 
				
			||||||
pa_proplist_new;
 | 
					 | 
				
			||||||
pa_proplist_set;
 | 
					 | 
				
			||||||
pa_proplist_setf;
 | 
					 | 
				
			||||||
pa_proplist_setp;
 | 
					 | 
				
			||||||
pa_proplist_sets;
 | 
					 | 
				
			||||||
pa_proplist_size;
 | 
					 | 
				
			||||||
pa_proplist_to_string;
 | 
					 | 
				
			||||||
pa_proplist_to_string_sep;
 | 
					 | 
				
			||||||
pa_proplist_unset;
 | 
					 | 
				
			||||||
pa_proplist_unset_many;
 | 
					 | 
				
			||||||
pa_proplist_update;
 | 
					 | 
				
			||||||
pa_rtclock_now;
 | 
					 | 
				
			||||||
pa_sample_format_is_be;
 | 
					 | 
				
			||||||
pa_sample_format_is_le;
 | 
					 | 
				
			||||||
pa_sample_format_to_string;
 | 
					 | 
				
			||||||
pa_sample_format_valid;
 | 
					 | 
				
			||||||
pa_sample_rate_valid;
 | 
					 | 
				
			||||||
pa_sample_size;
 | 
					 | 
				
			||||||
pa_sample_size_of_format;
 | 
					 | 
				
			||||||
pa_sample_spec_equal;
 | 
					 | 
				
			||||||
pa_sample_spec_init;
 | 
					 | 
				
			||||||
pa_sample_spec_snprint;
 | 
					 | 
				
			||||||
pa_sample_spec_valid;
 | 
					 | 
				
			||||||
pa_signal_done;
 | 
					 | 
				
			||||||
pa_signal_free;
 | 
					 | 
				
			||||||
pa_signal_init;
 | 
					 | 
				
			||||||
pa_signal_new;
 | 
					 | 
				
			||||||
pa_signal_set_destroy;
 | 
					 | 
				
			||||||
pa_simple_drain;
 | 
					 | 
				
			||||||
pa_simple_flush;
 | 
					 | 
				
			||||||
pa_simple_free;
 | 
					 | 
				
			||||||
pa_simple_get_latency;
 | 
					 | 
				
			||||||
pa_simple_new;
 | 
					 | 
				
			||||||
pa_simple_read;
 | 
					 | 
				
			||||||
pa_simple_write;
 | 
					 | 
				
			||||||
pa_stream_begin_write;
 | 
					 | 
				
			||||||
pa_stream_cancel_write;
 | 
					 | 
				
			||||||
pa_stream_connect_playback;
 | 
					 | 
				
			||||||
pa_stream_connect_record;
 | 
					 | 
				
			||||||
pa_stream_connect_upload;
 | 
					 | 
				
			||||||
pa_stream_cork;
 | 
					 | 
				
			||||||
pa_stream_disconnect;
 | 
					 | 
				
			||||||
pa_stream_drain;
 | 
					 | 
				
			||||||
pa_stream_drop;
 | 
					 | 
				
			||||||
pa_stream_finish_upload;
 | 
					 | 
				
			||||||
pa_stream_flush;
 | 
					 | 
				
			||||||
pa_stream_get_buffer_attr;
 | 
					 | 
				
			||||||
pa_stream_get_channel_map;
 | 
					 | 
				
			||||||
pa_stream_get_context;
 | 
					 | 
				
			||||||
pa_stream_get_device_index;
 | 
					 | 
				
			||||||
pa_stream_get_device_name;
 | 
					 | 
				
			||||||
pa_stream_get_format_info;
 | 
					 | 
				
			||||||
pa_stream_get_index;
 | 
					 | 
				
			||||||
pa_stream_get_latency;
 | 
					 | 
				
			||||||
pa_stream_get_monitor_stream;
 | 
					 | 
				
			||||||
pa_stream_get_sample_spec;
 | 
					 | 
				
			||||||
pa_stream_get_state;
 | 
					 | 
				
			||||||
pa_stream_get_time;
 | 
					 | 
				
			||||||
pa_stream_get_timing_info;
 | 
					 | 
				
			||||||
pa_stream_get_underflow_index;
 | 
					 | 
				
			||||||
pa_stream_is_corked;
 | 
					 | 
				
			||||||
pa_stream_is_suspended;
 | 
					 | 
				
			||||||
pa_stream_new;
 | 
					 | 
				
			||||||
pa_stream_new_extended;
 | 
					 | 
				
			||||||
pa_stream_new_with_proplist;
 | 
					 | 
				
			||||||
pa_stream_peek;
 | 
					 | 
				
			||||||
pa_stream_prebuf;
 | 
					 | 
				
			||||||
pa_stream_proplist_remove;
 | 
					 | 
				
			||||||
pa_stream_proplist_update;
 | 
					 | 
				
			||||||
pa_stream_readable_size;
 | 
					 | 
				
			||||||
pa_stream_ref;
 | 
					 | 
				
			||||||
pa_stream_set_buffer_attr;
 | 
					 | 
				
			||||||
pa_stream_set_buffer_attr_callback;
 | 
					 | 
				
			||||||
pa_stream_set_event_callback;
 | 
					 | 
				
			||||||
pa_stream_set_latency_update_callback;
 | 
					 | 
				
			||||||
pa_stream_set_monitor_stream;
 | 
					 | 
				
			||||||
pa_stream_set_moved_callback;
 | 
					 | 
				
			||||||
pa_stream_set_name;
 | 
					 | 
				
			||||||
pa_stream_set_overflow_callback;
 | 
					 | 
				
			||||||
pa_stream_set_read_callback;
 | 
					 | 
				
			||||||
pa_stream_set_started_callback;
 | 
					 | 
				
			||||||
pa_stream_set_state_callback;
 | 
					 | 
				
			||||||
pa_stream_set_suspended_callback;
 | 
					 | 
				
			||||||
pa_stream_set_underflow_callback;
 | 
					 | 
				
			||||||
pa_stream_set_write_callback;
 | 
					 | 
				
			||||||
pa_stream_trigger;
 | 
					 | 
				
			||||||
pa_stream_unref;
 | 
					 | 
				
			||||||
pa_stream_update_sample_rate;
 | 
					 | 
				
			||||||
pa_stream_update_timing_info;
 | 
					 | 
				
			||||||
pa_stream_writable_size;
 | 
					 | 
				
			||||||
pa_stream_write;
 | 
					 | 
				
			||||||
pa_stream_write_ext_free;
 | 
					 | 
				
			||||||
pa_strerror;
 | 
					 | 
				
			||||||
pa_sw_cvolume_divide;
 | 
					 | 
				
			||||||
pa_sw_cvolume_divide_scalar;
 | 
					 | 
				
			||||||
pa_sw_cvolume_multiply;
 | 
					 | 
				
			||||||
pa_sw_cvolume_multiply_scalar;
 | 
					 | 
				
			||||||
pa_sw_cvolume_snprint_dB;
 | 
					 | 
				
			||||||
pa_sw_volume_divide;
 | 
					 | 
				
			||||||
pa_sw_volume_from_dB;
 | 
					 | 
				
			||||||
pa_sw_volume_from_linear;
 | 
					 | 
				
			||||||
pa_sw_volume_multiply;
 | 
					 | 
				
			||||||
pa_sw_volume_snprint_dB;
 | 
					 | 
				
			||||||
pa_sw_volume_to_dB;
 | 
					 | 
				
			||||||
pa_sw_volume_to_linear;
 | 
					 | 
				
			||||||
pa_threaded_mainloop_accept;
 | 
					 | 
				
			||||||
pa_threaded_mainloop_free;
 | 
					 | 
				
			||||||
pa_threaded_mainloop_get_api;
 | 
					 | 
				
			||||||
pa_threaded_mainloop_get_retval;
 | 
					 | 
				
			||||||
pa_threaded_mainloop_in_thread;
 | 
					 | 
				
			||||||
pa_threaded_mainloop_lock;
 | 
					 | 
				
			||||||
pa_threaded_mainloop_new;
 | 
					 | 
				
			||||||
pa_threaded_mainloop_once_unlocked;
 | 
					 | 
				
			||||||
pa_threaded_mainloop_set_name;
 | 
					 | 
				
			||||||
pa_threaded_mainloop_signal;
 | 
					 | 
				
			||||||
pa_threaded_mainloop_start;
 | 
					 | 
				
			||||||
pa_threaded_mainloop_stop;
 | 
					 | 
				
			||||||
pa_threaded_mainloop_unlock;
 | 
					 | 
				
			||||||
pa_threaded_mainloop_wait;
 | 
					 | 
				
			||||||
pa_timeval_add;
 | 
					 | 
				
			||||||
pa_timeval_age;
 | 
					 | 
				
			||||||
pa_timeval_cmp;
 | 
					 | 
				
			||||||
pa_timeval_diff;
 | 
					 | 
				
			||||||
pa_timeval_load;
 | 
					 | 
				
			||||||
pa_timeval_store;
 | 
					 | 
				
			||||||
pa_timeval_sub;
 | 
					 | 
				
			||||||
pa_usec_to_bytes;
 | 
					 | 
				
			||||||
pa_utf8_filter;
 | 
					 | 
				
			||||||
pa_utf8_to_locale;
 | 
					 | 
				
			||||||
pa_utf8_valid;
 | 
					 | 
				
			||||||
pa_volume_snprint;
 | 
					 | 
				
			||||||
pa_volume_snprint_verbose;
 | 
					 | 
				
			||||||
pa_xfree;
 | 
					 | 
				
			||||||
pa_xmalloc;
 | 
					 | 
				
			||||||
pa_xmalloc0;
 | 
					 | 
				
			||||||
pa_xmemdup;
 | 
					 | 
				
			||||||
pa_xrealloc;
 | 
					 | 
				
			||||||
pa_xstrdup;
 | 
					 | 
				
			||||||
pa_xstrndup;
 | 
					 | 
				
			||||||
local:
 | 
					 | 
				
			||||||
*;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,7 +0,0 @@
 | 
				
			||||||
all:
 | 
					 | 
				
			||||||
	$(MAKE) -C ..
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean:
 | 
					 | 
				
			||||||
	$(MAKE) -C .. clean
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: all clean
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,133 +0,0 @@
 | 
				
			||||||
/***
 | 
					 | 
				
			||||||
  This file is part of PulseAudio.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Copyright 2006 Lennart Poettering
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PulseAudio 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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PulseAudio is distributed in the hope that it will be useful, but
 | 
					 | 
				
			||||||
  WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | 
					 | 
				
			||||||
  General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
  along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
***/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef HAVE_CONFIG_H
 | 
					 | 
				
			||||||
#include <config.h>
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <gconf/gconf-client.h>
 | 
					 | 
				
			||||||
#include <glib.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <pulsecore/core-util.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define PA_GCONF_ROOT "/system/pulseaudio"
 | 
					 | 
				
			||||||
#define PA_GCONF_PATH_MODULES PA_GCONF_ROOT"/modules"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void handle_module(GConfClient *client, const char *name) {
 | 
					 | 
				
			||||||
    gchar p[1024];
 | 
					 | 
				
			||||||
    gboolean enabled, locked;
 | 
					 | 
				
			||||||
    int i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/locked", name);
 | 
					 | 
				
			||||||
    locked = gconf_client_get_bool(client, p, FALSE);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (locked)
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/enabled", name);
 | 
					 | 
				
			||||||
    enabled = gconf_client_get_bool(client, p, FALSE);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    printf("%c%s%c", enabled ? '+' : '-', name, 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (enabled) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (i = 0; i < 10; i++) {
 | 
					 | 
				
			||||||
            gchar *n, *a;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/name%i", name, i);
 | 
					 | 
				
			||||||
            if (!(n = gconf_client_get_string(client, p, NULL)) || !*n)
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/args%i", name, i);
 | 
					 | 
				
			||||||
            a = gconf_client_get_string(client, p, NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            printf("%s%c%s%c", n, 0, a ? a : "", 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            g_free(n);
 | 
					 | 
				
			||||||
            g_free(a);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        printf("%c", 0);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fflush(stdout);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void modules_callback(
 | 
					 | 
				
			||||||
        GConfClient* client,
 | 
					 | 
				
			||||||
        guint cnxn_id,
 | 
					 | 
				
			||||||
        GConfEntry *entry,
 | 
					 | 
				
			||||||
        gpointer user_data) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const char *n;
 | 
					 | 
				
			||||||
    char buf[128];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_assert(strncmp(entry->key, PA_GCONF_PATH_MODULES"/", sizeof(PA_GCONF_PATH_MODULES)) == 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    n = entry->key + sizeof(PA_GCONF_PATH_MODULES);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_strlcpy(buf, n, sizeof(buf));
 | 
					 | 
				
			||||||
    buf[strcspn(buf, "/")] = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    handle_module(client, buf);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int main(int argc, char *argv[]) {
 | 
					 | 
				
			||||||
    GMainLoop *g;
 | 
					 | 
				
			||||||
    GConfClient *client;
 | 
					 | 
				
			||||||
    GSList *modules, *m;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if !GLIB_CHECK_VERSION(2,36,0)
 | 
					 | 
				
			||||||
    g_type_init();
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!(client = gconf_client_get_default()))
 | 
					 | 
				
			||||||
        goto fail;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    gconf_client_add_dir(client, PA_GCONF_ROOT, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL);
 | 
					 | 
				
			||||||
    gconf_client_notify_add(client, PA_GCONF_PATH_MODULES, modules_callback, NULL, NULL, NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    modules = gconf_client_all_dirs(client, PA_GCONF_PATH_MODULES, NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (m = modules; m; m = m->next) {
 | 
					 | 
				
			||||||
        char *e = strrchr(m->data, '/');
 | 
					 | 
				
			||||||
        handle_module(client, e ? e+1 : m->data);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_slist_free(modules);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Signal the parent that we are now initialized */
 | 
					 | 
				
			||||||
    printf("!");
 | 
					 | 
				
			||||||
    fflush(stdout);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g = g_main_loop_new(NULL, FALSE);
 | 
					 | 
				
			||||||
    g_main_loop_run(g);
 | 
					 | 
				
			||||||
    g_main_loop_unref(g);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_object_unref(G_OBJECT(client));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
fail:
 | 
					 | 
				
			||||||
    return 1;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,114 +0,0 @@
 | 
				
			||||||
/***
 | 
					 | 
				
			||||||
  This file is part of PulseAudio.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Copyright 2006 Lennart Poettering
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PulseAudio 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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PulseAudio is distributed in the hope that it will be useful, but
 | 
					 | 
				
			||||||
  WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | 
					 | 
				
			||||||
  General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
  along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
***/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef HAVE_CONFIG_H
 | 
					 | 
				
			||||||
#include <config.h>
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <sys/types.h>
 | 
					 | 
				
			||||||
#include <sys/wait.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <pulsecore/core-error.h>
 | 
					 | 
				
			||||||
#include <pulsecore/core-util.h>
 | 
					 | 
				
			||||||
#include <pulsecore/start-child.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "../stdin-util.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PA_MODULE_AUTHOR("Lennart Poettering");
 | 
					 | 
				
			||||||
PA_MODULE_DESCRIPTION("GConf Adapter");
 | 
					 | 
				
			||||||
PA_MODULE_VERSION(PACKAGE_VERSION);
 | 
					 | 
				
			||||||
PA_MODULE_LOAD_ONCE(true);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int pa__init(pa_module*m) {
 | 
					 | 
				
			||||||
    struct userdata *u;
 | 
					 | 
				
			||||||
    int r;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    u = pa_xnew(struct userdata, 1);
 | 
					 | 
				
			||||||
    u->core = m->core;
 | 
					 | 
				
			||||||
    u->module = m;
 | 
					 | 
				
			||||||
    m->userdata = u;
 | 
					 | 
				
			||||||
    u->module_infos = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) module_info_free);
 | 
					 | 
				
			||||||
    u->pid = (pid_t) -1;
 | 
					 | 
				
			||||||
    u->fd = -1;
 | 
					 | 
				
			||||||
    u->fd_type = 0;
 | 
					 | 
				
			||||||
    u->io_event = NULL;
 | 
					 | 
				
			||||||
    u->buf_fill = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if ((u->fd = pa_start_child_for_read(
 | 
					 | 
				
			||||||
#if defined(__linux__) && defined(HAVE_RUNNING_FROM_BUILD_TREE)
 | 
					 | 
				
			||||||
                              pa_run_from_build_tree() ? PA_BUILDDIR "/gconf-helper" :
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                 PA_GCONF_HELPER, NULL, &u->pid)) < 0)
 | 
					 | 
				
			||||||
        goto fail;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    u->io_event = m->core->mainloop->io_new(
 | 
					 | 
				
			||||||
            m->core->mainloop,
 | 
					 | 
				
			||||||
            u->fd,
 | 
					 | 
				
			||||||
            PA_IO_EVENT_INPUT,
 | 
					 | 
				
			||||||
            io_event_cb,
 | 
					 | 
				
			||||||
            u);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    do {
 | 
					 | 
				
			||||||
        if ((r = handle_event(u)) < 0)
 | 
					 | 
				
			||||||
            goto fail;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /* Read until the client signalled us that it is ready with
 | 
					 | 
				
			||||||
         * initialization */
 | 
					 | 
				
			||||||
    } while (r != 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
fail:
 | 
					 | 
				
			||||||
    pa__done(m);
 | 
					 | 
				
			||||||
    return -1;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void pa__done(pa_module*m) {
 | 
					 | 
				
			||||||
    struct userdata *u;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pa_assert(m);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!(u = m->userdata))
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (u->pid != (pid_t) -1) {
 | 
					 | 
				
			||||||
        kill(u->pid, SIGTERM);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (;;) {
 | 
					 | 
				
			||||||
            if (waitpid(u->pid, NULL, 0) >= 0)
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (errno != EINTR) {
 | 
					 | 
				
			||||||
                pa_log("waitpid() failed: %s", pa_cstrerror(errno));
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (u->io_event)
 | 
					 | 
				
			||||||
        m->core->mainloop->io_free(u->io_event);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (u->fd >= 0)
 | 
					 | 
				
			||||||
        pa_close(u->fd);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (u->module_infos)
 | 
					 | 
				
			||||||
        pa_hashmap_free(u->module_infos);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pa_xfree(u);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1 +0,0 @@
 | 
				
			||||||
../modules/Makefile
 | 
					 | 
				
			||||||
							
								
								
									
										614
									
								
								src/pulse/json.c
									
										
									
									
									
								
							
							
						
						
									
										614
									
								
								src/pulse/json.c
									
										
									
									
									
								
							| 
						 | 
					@ -1,614 +0,0 @@
 | 
				
			||||||
/***
 | 
					 | 
				
			||||||
  This file is part of PulseAudio.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Copyright 2016 Arun Raghavan <mail@arunraghavan.net>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PulseAudio 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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PulseAudio is distributed in the hope that it will be useful, but
 | 
					 | 
				
			||||||
  WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | 
					 | 
				
			||||||
  General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
  along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
***/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef HAVE_CONFIG_H
 | 
					 | 
				
			||||||
#include <config.h>
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <math.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <pulse/json.h>
 | 
					 | 
				
			||||||
#include <pulse/xmalloc.h>
 | 
					 | 
				
			||||||
#include <pulsecore/core-util.h>
 | 
					 | 
				
			||||||
#include <pulsecore/hashmap.h>
 | 
					 | 
				
			||||||
#include <pulsecore/strbuf.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MAX_NESTING_DEPTH 20 /* Arbitrary number to make sure we don't have a stack overflow */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct pa_json_object {
 | 
					 | 
				
			||||||
    pa_json_type type;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    union {
 | 
					 | 
				
			||||||
        int int_value;
 | 
					 | 
				
			||||||
        double double_value;
 | 
					 | 
				
			||||||
        bool bool_value;
 | 
					 | 
				
			||||||
        char *string_value;
 | 
					 | 
				
			||||||
        pa_hashmap *object_values; /* name -> object */
 | 
					 | 
				
			||||||
        pa_idxset *array_values; /* objects */
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const char* parse_value(const char *str, const char *end, pa_json_object **obj, unsigned int depth);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static pa_json_object* json_object_new(void) {
 | 
					 | 
				
			||||||
    pa_json_object *obj;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    obj = pa_xnew0(pa_json_object, 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return obj;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static bool is_whitespace(char c) {
 | 
					 | 
				
			||||||
    return c == '\t' || c == '\n' || c == '\r' || c == ' ';
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static bool is_digit(char c) {
 | 
					 | 
				
			||||||
    return c >= '0' && c <= '9';
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static bool is_end(const char c, const char *end) {
 | 
					 | 
				
			||||||
    if (!end)
 | 
					 | 
				
			||||||
        return c == '\0';
 | 
					 | 
				
			||||||
    else  {
 | 
					 | 
				
			||||||
        while (*end) {
 | 
					 | 
				
			||||||
            if (c == *end)
 | 
					 | 
				
			||||||
                return true;
 | 
					 | 
				
			||||||
            end++;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return false;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const char* consume_string(const char *str, const char *expect) {
 | 
					 | 
				
			||||||
    while (*expect) {
 | 
					 | 
				
			||||||
        if (*str != *expect)
 | 
					 | 
				
			||||||
            return NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        str++;
 | 
					 | 
				
			||||||
        expect++;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return str;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const char* parse_null(const char *str, pa_json_object *obj) {
 | 
					 | 
				
			||||||
    str = consume_string(str, "null");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (str)
 | 
					 | 
				
			||||||
        obj->type = PA_JSON_TYPE_NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return str;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const char* parse_boolean(const char *str, pa_json_object *obj) {
 | 
					 | 
				
			||||||
    const char *tmp;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    tmp = consume_string(str, "true");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (tmp) {
 | 
					 | 
				
			||||||
        obj->type = PA_JSON_TYPE_BOOL;
 | 
					 | 
				
			||||||
        obj->bool_value = true;
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        tmp = consume_string(str, "false");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (str) {
 | 
					 | 
				
			||||||
            obj->type = PA_JSON_TYPE_BOOL;
 | 
					 | 
				
			||||||
            obj->bool_value = false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return tmp;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const char* parse_string(const char *str, pa_json_object *obj) {
 | 
					 | 
				
			||||||
    pa_strbuf *buf = pa_strbuf_new();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    str++; /* Consume leading '"' */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while (*str && *str != '"') {
 | 
					 | 
				
			||||||
        if (*str != '\\') {
 | 
					 | 
				
			||||||
            /* We only accept ASCII printable characters. */
 | 
					 | 
				
			||||||
            if (*str < 0x20 || *str > 0x7E) {
 | 
					 | 
				
			||||||
                pa_log("Invalid non-ASCII character: 0x%x", (unsigned int) *str);
 | 
					 | 
				
			||||||
                goto error;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            /* Normal character, juts consume */
 | 
					 | 
				
			||||||
            pa_strbuf_putc(buf, *str);
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            /* Need to unescape */
 | 
					 | 
				
			||||||
            str++;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            switch (*str) {
 | 
					 | 
				
			||||||
                case '"':
 | 
					 | 
				
			||||||
                case '\\':
 | 
					 | 
				
			||||||
                case '/':
 | 
					 | 
				
			||||||
                    pa_strbuf_putc(buf, *str);
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                case 'b':
 | 
					 | 
				
			||||||
                    pa_strbuf_putc(buf, '\b' /* backspace */);
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                case 'f':
 | 
					 | 
				
			||||||
                    pa_strbuf_putc(buf, '\f' /* form feed */);
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                case 'n':
 | 
					 | 
				
			||||||
                    pa_strbuf_putc(buf, '\n' /* new line */);
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                case 'r':
 | 
					 | 
				
			||||||
                    pa_strbuf_putc(buf, '\r' /* carriage return */);
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                case 't':
 | 
					 | 
				
			||||||
                    pa_strbuf_putc(buf, '\t' /* horizontal tab */);
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                case 'u':
 | 
					 | 
				
			||||||
                    pa_log("Unicode code points are currently unsupported");
 | 
					 | 
				
			||||||
                    goto error;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                default:
 | 
					 | 
				
			||||||
                    pa_log("Unexepcted escape value: %c", *str);
 | 
					 | 
				
			||||||
                    goto error;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        str++;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (*str != '"') {
 | 
					 | 
				
			||||||
        pa_log("Failed to parse remainder of string: %s", str);
 | 
					 | 
				
			||||||
        goto error;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    str++;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    obj->type = PA_JSON_TYPE_STRING;
 | 
					 | 
				
			||||||
    obj->string_value = pa_strbuf_to_string_free(buf);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return str;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
error:
 | 
					 | 
				
			||||||
    pa_strbuf_free(buf);
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const char* parse_number(const char *str, pa_json_object *obj) {
 | 
					 | 
				
			||||||
    bool negative = false, has_fraction = false, has_exponent = false, valid = false;
 | 
					 | 
				
			||||||
    unsigned int integer = 0;
 | 
					 | 
				
			||||||
    unsigned int fraction = 0;
 | 
					 | 
				
			||||||
    unsigned int fraction_digits = 0;
 | 
					 | 
				
			||||||
    int exponent = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (*str == '-') {
 | 
					 | 
				
			||||||
        negative = true;
 | 
					 | 
				
			||||||
        str++;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (*str == '0') {
 | 
					 | 
				
			||||||
        valid = true;
 | 
					 | 
				
			||||||
        str++;
 | 
					 | 
				
			||||||
        goto fraction;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while (is_digit(*str)) {
 | 
					 | 
				
			||||||
        valid = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (integer > ((negative ? INT_MAX : UINT_MAX) / 10)) {
 | 
					 | 
				
			||||||
            pa_log("Integer overflow while parsing number");
 | 
					 | 
				
			||||||
            goto error;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        integer = (integer * 10) + (*str - '0');
 | 
					 | 
				
			||||||
        str++;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
fraction:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!valid) {
 | 
					 | 
				
			||||||
        pa_log("Missing digits while parsing number");
 | 
					 | 
				
			||||||
        goto error;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (*str == '.') {
 | 
					 | 
				
			||||||
        has_fraction = true;
 | 
					 | 
				
			||||||
        str++;
 | 
					 | 
				
			||||||
        valid = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        while (is_digit(*str)) {
 | 
					 | 
				
			||||||
            valid = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (fraction > (UINT_MAX / 10)) {
 | 
					 | 
				
			||||||
                pa_log("Integer overflow while parsing fractional part of number");
 | 
					 | 
				
			||||||
                goto error;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            fraction = (fraction * 10) + (*str - '0');
 | 
					 | 
				
			||||||
            fraction_digits++;
 | 
					 | 
				
			||||||
            str++;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!valid) {
 | 
					 | 
				
			||||||
            pa_log("No digit after '.' while parsing fraction");
 | 
					 | 
				
			||||||
            goto error;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (*str == 'e' || *str == 'E') {
 | 
					 | 
				
			||||||
        bool exponent_negative = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        has_exponent = true;
 | 
					 | 
				
			||||||
        str++;
 | 
					 | 
				
			||||||
        valid = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (*str == '-') {
 | 
					 | 
				
			||||||
            exponent_negative = true;
 | 
					 | 
				
			||||||
            str++;
 | 
					 | 
				
			||||||
        } else if (*str == '+')
 | 
					 | 
				
			||||||
            str++;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        while (is_digit(*str)) {
 | 
					 | 
				
			||||||
            valid = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (exponent > (INT_MAX / 10)) {
 | 
					 | 
				
			||||||
                pa_log("Integer overflow while parsing exponent part of number");
 | 
					 | 
				
			||||||
                goto error;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            exponent = (exponent * 10) + (*str - '0');
 | 
					 | 
				
			||||||
            str++;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!valid) {
 | 
					 | 
				
			||||||
            pa_log("No digit in exponent while parsing fraction");
 | 
					 | 
				
			||||||
            goto error;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (exponent_negative)
 | 
					 | 
				
			||||||
            exponent *= -1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (has_fraction || has_exponent) {
 | 
					 | 
				
			||||||
        obj->type = PA_JSON_TYPE_DOUBLE;
 | 
					 | 
				
			||||||
        obj->double_value =
 | 
					 | 
				
			||||||
            (negative ? -1.0 : 1.0) * (integer + (double) fraction / pow(10, fraction_digits)) * pow(10, exponent);
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        obj->type = PA_JSON_TYPE_INT;
 | 
					 | 
				
			||||||
        obj->int_value = (negative ? -1 : 1) * integer;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return str;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
error:
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const char *parse_object(const char *str, pa_json_object *obj, unsigned int depth) {
 | 
					 | 
				
			||||||
    pa_json_object *name = NULL, *value = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    obj->object_values = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func,
 | 
					 | 
				
			||||||
                                             pa_xfree, (pa_free_cb_t) pa_json_object_free);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while (*str != '}') {
 | 
					 | 
				
			||||||
        str++; /* Consume leading '{' or ',' */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        str = parse_value(str, ":", &name, depth + 1);
 | 
					 | 
				
			||||||
        if (!str || pa_json_object_get_type(name) != PA_JSON_TYPE_STRING) {
 | 
					 | 
				
			||||||
            pa_log("Could not parse key for object");
 | 
					 | 
				
			||||||
            goto error;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /* Consume the ':' */
 | 
					 | 
				
			||||||
        str++;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        str = parse_value(str, ",}", &value, depth + 1);
 | 
					 | 
				
			||||||
        if (!str) {
 | 
					 | 
				
			||||||
            pa_log("Could not parse value for object");
 | 
					 | 
				
			||||||
            goto error;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        pa_hashmap_put(obj->object_values, pa_xstrdup(pa_json_object_get_string(name)), value);
 | 
					 | 
				
			||||||
        pa_json_object_free(name);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        name = NULL;
 | 
					 | 
				
			||||||
        value = NULL;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Drop trailing '}' */
 | 
					 | 
				
			||||||
    str++;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* We now know the value was correctly parsed */
 | 
					 | 
				
			||||||
    obj->type = PA_JSON_TYPE_OBJECT;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return str;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
error:
 | 
					 | 
				
			||||||
    pa_hashmap_free(obj->object_values);
 | 
					 | 
				
			||||||
    obj->object_values = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (name)
 | 
					 | 
				
			||||||
        pa_json_object_free(name);
 | 
					 | 
				
			||||||
    if (value)
 | 
					 | 
				
			||||||
        pa_json_object_free(value);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const char *parse_array(const char *str, pa_json_object *obj, unsigned int depth) {
 | 
					 | 
				
			||||||
    pa_json_object *value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    obj->array_values = pa_idxset_new(NULL, NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while (*str != ']') {
 | 
					 | 
				
			||||||
        str++; /* Consume leading '[' or ',' */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /* Need to chew up whitespaces as a special case to deal with the
 | 
					 | 
				
			||||||
         * possibility of an empty array */
 | 
					 | 
				
			||||||
        while (is_whitespace(*str))
 | 
					 | 
				
			||||||
            str++;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (*str == ']')
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        str = parse_value(str, ",]", &value, depth + 1);
 | 
					 | 
				
			||||||
        if (!str) {
 | 
					 | 
				
			||||||
            pa_log("Could not parse value for array");
 | 
					 | 
				
			||||||
            goto error;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        pa_idxset_put(obj->array_values, value, NULL);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* Drop trailing ']' */
 | 
					 | 
				
			||||||
    str++;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* We now know the value was correctly parsed */
 | 
					 | 
				
			||||||
    obj->type = PA_JSON_TYPE_ARRAY;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return str;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
error:
 | 
					 | 
				
			||||||
    pa_idxset_free(obj->array_values, (pa_free_cb_t) pa_json_object_free);
 | 
					 | 
				
			||||||
    obj->array_values = NULL;
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef enum {
 | 
					 | 
				
			||||||
    JSON_PARSER_STATE_INIT,
 | 
					 | 
				
			||||||
    JSON_PARSER_STATE_FINISH,
 | 
					 | 
				
			||||||
} json_parser_state;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const char* parse_value(const char *str, const char *end, pa_json_object **obj, unsigned int depth) {
 | 
					 | 
				
			||||||
    json_parser_state state = JSON_PARSER_STATE_INIT;
 | 
					 | 
				
			||||||
    pa_json_object *o;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pa_assert(str != NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    o = json_object_new();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (depth > MAX_NESTING_DEPTH) {
 | 
					 | 
				
			||||||
        pa_log("Exceeded maximum permitted nesting depth of objects (%u)", MAX_NESTING_DEPTH);
 | 
					 | 
				
			||||||
        goto error;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while (!is_end(*str, end)) {
 | 
					 | 
				
			||||||
        switch (state) {
 | 
					 | 
				
			||||||
            case JSON_PARSER_STATE_INIT:
 | 
					 | 
				
			||||||
                if (is_whitespace(*str)) {
 | 
					 | 
				
			||||||
                    str++;
 | 
					 | 
				
			||||||
                } else if (*str == 'n') {
 | 
					 | 
				
			||||||
                    str = parse_null(str, o);
 | 
					 | 
				
			||||||
                    state = JSON_PARSER_STATE_FINISH;
 | 
					 | 
				
			||||||
                } else if (*str == 't' || *str == 'f') {
 | 
					 | 
				
			||||||
                    str = parse_boolean(str, o);
 | 
					 | 
				
			||||||
                    state = JSON_PARSER_STATE_FINISH;
 | 
					 | 
				
			||||||
                } else if (*str == '"') {
 | 
					 | 
				
			||||||
                    str = parse_string(str, o);
 | 
					 | 
				
			||||||
                    state = JSON_PARSER_STATE_FINISH;
 | 
					 | 
				
			||||||
                } else if (is_digit(*str) || *str == '-') {
 | 
					 | 
				
			||||||
                    str = parse_number(str, o);
 | 
					 | 
				
			||||||
                    state = JSON_PARSER_STATE_FINISH;
 | 
					 | 
				
			||||||
                } else if (*str == '{') {
 | 
					 | 
				
			||||||
                    str = parse_object(str, o, depth);
 | 
					 | 
				
			||||||
                    state = JSON_PARSER_STATE_FINISH;
 | 
					 | 
				
			||||||
                } else if (*str == '[') {
 | 
					 | 
				
			||||||
                    str = parse_array(str, o, depth);
 | 
					 | 
				
			||||||
                    state = JSON_PARSER_STATE_FINISH;
 | 
					 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    pa_log("Invalid JSON string: %s", str);
 | 
					 | 
				
			||||||
                    goto error;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (!str)
 | 
					 | 
				
			||||||
                    goto error;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            case JSON_PARSER_STATE_FINISH:
 | 
					 | 
				
			||||||
                /* Consume trailing whitespaces */
 | 
					 | 
				
			||||||
                if (is_whitespace(*str)) {
 | 
					 | 
				
			||||||
                    str++;
 | 
					 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    goto error;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (pa_json_object_get_type(o) == PA_JSON_TYPE_INIT) {
 | 
					 | 
				
			||||||
        /* We didn't actually get any data */
 | 
					 | 
				
			||||||
        pa_log("No data while parsing json string: '%s' till '%s'", str, pa_strnull(end));
 | 
					 | 
				
			||||||
        goto error;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    *obj = o;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return str;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
error:
 | 
					 | 
				
			||||||
    pa_json_object_free(o);
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pa_json_object* pa_json_parse(const char *str) {
 | 
					 | 
				
			||||||
    pa_json_object *obj;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    str = parse_value(str, NULL, &obj, 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!str) {
 | 
					 | 
				
			||||||
        pa_log("JSON parsing failed");
 | 
					 | 
				
			||||||
        return NULL;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (*str != '\0') {
 | 
					 | 
				
			||||||
        pa_log("Unable to parse complete JSON string, remainder is: %s", str);
 | 
					 | 
				
			||||||
        pa_json_object_free(obj);
 | 
					 | 
				
			||||||
        return NULL;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return obj;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pa_json_type pa_json_object_get_type(const pa_json_object *obj) {
 | 
					 | 
				
			||||||
    return obj->type;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void pa_json_object_free(pa_json_object *obj) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    switch (pa_json_object_get_type(obj)) {
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_INIT:
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_INT:
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_DOUBLE:
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_BOOL:
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_NULL:
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_STRING:
 | 
					 | 
				
			||||||
            pa_xfree(obj->string_value);
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_OBJECT:
 | 
					 | 
				
			||||||
            pa_hashmap_free(obj->object_values);
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_ARRAY:
 | 
					 | 
				
			||||||
            pa_idxset_free(obj->array_values, (pa_free_cb_t) pa_json_object_free);
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        default:
 | 
					 | 
				
			||||||
            pa_assert_not_reached();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pa_xfree(obj);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int pa_json_object_get_int(const pa_json_object *o) {
 | 
					 | 
				
			||||||
    pa_assert(pa_json_object_get_type(o) == PA_JSON_TYPE_INT);
 | 
					 | 
				
			||||||
    return o->int_value;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
double pa_json_object_get_double(const pa_json_object *o) {
 | 
					 | 
				
			||||||
    pa_assert(pa_json_object_get_type(o) == PA_JSON_TYPE_DOUBLE);
 | 
					 | 
				
			||||||
    return o->double_value;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool pa_json_object_get_bool(const pa_json_object *o) {
 | 
					 | 
				
			||||||
    pa_assert(pa_json_object_get_type(o) == PA_JSON_TYPE_BOOL);
 | 
					 | 
				
			||||||
    return o->bool_value;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const char* pa_json_object_get_string(const pa_json_object *o) {
 | 
					 | 
				
			||||||
    pa_assert(pa_json_object_get_type(o) == PA_JSON_TYPE_STRING);
 | 
					 | 
				
			||||||
    return o->string_value;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const pa_json_object* pa_json_object_get_object_member(const pa_json_object *o, const char *name) {
 | 
					 | 
				
			||||||
    pa_assert(pa_json_object_get_type(o) == PA_JSON_TYPE_OBJECT);
 | 
					 | 
				
			||||||
    return pa_hashmap_get(o->object_values, name);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int pa_json_object_get_array_length(const pa_json_object *o) {
 | 
					 | 
				
			||||||
    pa_assert(pa_json_object_get_type(o) == PA_JSON_TYPE_ARRAY);
 | 
					 | 
				
			||||||
    return pa_idxset_size(o->array_values);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const pa_json_object* pa_json_object_get_array_member(const pa_json_object *o, int index) {
 | 
					 | 
				
			||||||
    pa_assert(pa_json_object_get_type(o) == PA_JSON_TYPE_ARRAY);
 | 
					 | 
				
			||||||
    return pa_idxset_get_by_index(o->array_values, index);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool pa_json_object_equal(const pa_json_object *o1, const pa_json_object *o2) {
 | 
					 | 
				
			||||||
    int i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (pa_json_object_get_type(o1) != pa_json_object_get_type(o2))
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    switch (pa_json_object_get_type(o1)) {
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_NULL:
 | 
					 | 
				
			||||||
            return true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_BOOL:
 | 
					 | 
				
			||||||
            return o1->bool_value == o2->bool_value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_INT:
 | 
					 | 
				
			||||||
            return o1->int_value == o2->int_value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_DOUBLE:
 | 
					 | 
				
			||||||
            return PA_DOUBLE_IS_EQUAL(o1->double_value, o2->double_value);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_STRING:
 | 
					 | 
				
			||||||
            return pa_streq(o1->string_value, o2->string_value);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_ARRAY:
 | 
					 | 
				
			||||||
            if (pa_json_object_get_array_length(o1) != pa_json_object_get_array_length(o2))
 | 
					 | 
				
			||||||
                return false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            for (i = 0; i < pa_json_object_get_array_length(o1); i++) {
 | 
					 | 
				
			||||||
                if (!pa_json_object_equal(pa_json_object_get_array_member(o1, i),
 | 
					 | 
				
			||||||
                            pa_json_object_get_array_member(o2, i)))
 | 
					 | 
				
			||||||
                    return false;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            return true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        case PA_JSON_TYPE_OBJECT: {
 | 
					 | 
				
			||||||
            void *state;
 | 
					 | 
				
			||||||
            const char *key;
 | 
					 | 
				
			||||||
            const pa_json_object *v1, *v2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (pa_hashmap_size(o1->object_values) != pa_hashmap_size(o2->object_values))
 | 
					 | 
				
			||||||
                return false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            PA_HASHMAP_FOREACH_KV(key, v1, o1->object_values, state) {
 | 
					 | 
				
			||||||
                v2 = pa_json_object_get_object_member(o2, key);
 | 
					 | 
				
			||||||
                if (!v2 || !pa_json_object_equal(v1, v2))
 | 
					 | 
				
			||||||
                    return false;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            return true;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        default:
 | 
					 | 
				
			||||||
            pa_assert_not_reached();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,53 +0,0 @@
 | 
				
			||||||
/***
 | 
					 | 
				
			||||||
  This file is part of PulseAudio.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Copyright 2016 Arun Raghavan <mail@arunraghavan.net>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PulseAudio 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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PulseAudio is distributed in the hope that it will be useful, but
 | 
					 | 
				
			||||||
  WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | 
					 | 
				
			||||||
  General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
  along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
***/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdbool.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define PA_DOUBLE_IS_EQUAL(x, y) (((x) - (y)) < 0.000001 && ((x) - (y)) > -0.000001)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef enum {
 | 
					 | 
				
			||||||
    PA_JSON_TYPE_INIT = 0,
 | 
					 | 
				
			||||||
    PA_JSON_TYPE_NULL,
 | 
					 | 
				
			||||||
    PA_JSON_TYPE_INT,
 | 
					 | 
				
			||||||
    PA_JSON_TYPE_DOUBLE,
 | 
					 | 
				
			||||||
    PA_JSON_TYPE_BOOL,
 | 
					 | 
				
			||||||
    PA_JSON_TYPE_STRING,
 | 
					 | 
				
			||||||
    PA_JSON_TYPE_ARRAY,
 | 
					 | 
				
			||||||
    PA_JSON_TYPE_OBJECT,
 | 
					 | 
				
			||||||
} pa_json_type;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct pa_json_object pa_json_object;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pa_json_object* pa_json_parse(const char *str);
 | 
					 | 
				
			||||||
pa_json_type pa_json_object_get_type(const pa_json_object *obj);
 | 
					 | 
				
			||||||
void pa_json_object_free(pa_json_object *obj);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* All pointer members that are returned are valid while the corresponding object is valid */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int pa_json_object_get_int(const pa_json_object *o);
 | 
					 | 
				
			||||||
double pa_json_object_get_double(const pa_json_object *o);
 | 
					 | 
				
			||||||
bool pa_json_object_get_bool(const pa_json_object *o);
 | 
					 | 
				
			||||||
const char* pa_json_object_get_string(const pa_json_object *o);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const pa_json_object* pa_json_object_get_object_member(const pa_json_object *o, const char *name);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int pa_json_object_get_array_length(const pa_json_object *o);
 | 
					 | 
				
			||||||
const pa_json_object* pa_json_object_get_array_member(const pa_json_object *o, int index);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool pa_json_object_equal(const pa_json_object *o1, const pa_json_object *o2);
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1 +0,0 @@
 | 
				
			||||||
../modules/Makefile
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,53 +0,0 @@
 | 
				
			||||||
/***
 | 
					 | 
				
			||||||
  This file is part of PulseAudio.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PulseAudio 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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  PulseAudio is distributed in the hope that it will be useful, but
 | 
					 | 
				
			||||||
  WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | 
					 | 
				
			||||||
  General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  You should have received a copy of the GNU Lesser General Public License
 | 
					 | 
				
			||||||
  along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
***/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef HAVE_CONFIG_H
 | 
					 | 
				
			||||||
#include <config.h>
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef OS_IS_WIN32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <windows.h>
 | 
					 | 
				
			||||||
#include <winsock2.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern char *pa_win32_get_toplevel(HANDLE handle);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
 | 
					 | 
				
			||||||
    WSADATA data;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    switch (fdwReason) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    case DLL_PROCESS_ATTACH:
 | 
					 | 
				
			||||||
        if (!pa_win32_get_toplevel(hinstDLL))
 | 
					 | 
				
			||||||
            return FALSE;
 | 
					 | 
				
			||||||
        WSAStartup(MAKEWORD(2, 0), &data);
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    case DLL_PROCESS_DETACH:
 | 
					 | 
				
			||||||
        WSACleanup();
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return TRUE;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* OS_IS_WIN32 */
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1 +0,0 @@
 | 
				
			||||||
../modules/Makefile
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1 +0,0 @@
 | 
				
			||||||
../modules/Makefile
 | 
					 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue