Thanks to the fine work of Russell Bryant and Dancho Lazarov, we now have autoconf and menuselect tools for Asterisk!
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@22267 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
parent
746c984500
commit
574e14cbea
171
Makefile
171
Makefile
|
@ -49,7 +49,7 @@ PWD=$(shell pwd)
|
|||
# Remember the MAKELEVEL at the top
|
||||
MAKETOPLEVEL?=$(MAKELEVEL)
|
||||
|
||||
ifneq ($(findstring dont-optimize,$(MAKECMDGOALS)),dont-optimize)
|
||||
ifeq ($(findstring dont-optimize,$(MAKECMDGOALS)),)
|
||||
# More GSM codec optimization
|
||||
# Uncomment to enable MMXTM optimizations for x86 architecture CPU's
|
||||
# which support MMX instructions. This should be newer pentiums,
|
||||
|
@ -97,13 +97,6 @@ DEBUG_THREADS += #-DDEBUG_CHANNEL_LOCKS
|
|||
# Uncomment next one to enable ast_frame tracing (for debugging)
|
||||
TRACE_FRAMES = #-DTRACE_FRAMES
|
||||
|
||||
# Uncomment next one to enable malloc debugging
|
||||
# You can view malloc debugging with:
|
||||
# *CLI> show memory allocations [filename]
|
||||
# *CLI> show memory summary [filename]
|
||||
#
|
||||
MALLOC_DEBUG = #-include $(PWD)/include/asterisk/astmm.h
|
||||
|
||||
# Where to install asterisk after compiling
|
||||
# Default -> leave empty
|
||||
INSTALL_PREFIX?=
|
||||
|
@ -182,26 +175,39 @@ HTTP_CGIDIR=/var/www/cgi-bin
|
|||
|
||||
ASTCFLAGS=
|
||||
|
||||
# Define this to use files larger than 2GB (useful for sound files longer than 37 hours and logfiles)
|
||||
ASTCFLAGS+=-D_FILE_OFFSET_BITS=64
|
||||
|
||||
# Uncomment this to use the older DSP routines
|
||||
#ASTCFLAGS+=-DOLD_DSP_ROUTINES
|
||||
|
||||
# If the file .asterisk.makeopts is present in your home directory, you can
|
||||
# include all of your favorite Makefile options so that every time you download
|
||||
# a new version of Asterisk, you don't have to edit the makefile to set them.
|
||||
# The file, /etc/asterisk.makeopts will also be included, but can be overridden
|
||||
# include all of your favorite menuselect options so that every time you download
|
||||
# a new version of Asterisk, you don't have to run menuselect to set them.
|
||||
# The file /etc/asterisk.makeopts will also be included but can be overridden
|
||||
# by the file in your home directory.
|
||||
|
||||
ifneq ($(wildcard /etc/asterisk.makeopts),)
|
||||
include /etc/asterisk.makeopts
|
||||
GLOBAL_MAKEOPTS=$(wildcard /etc/asterisk.makeopts)
|
||||
USER_MAKEOPTS=$(wildcard ~/.asterisk.makeopts)
|
||||
|
||||
ifneq ($(wildcard menuselect.makeopts),)
|
||||
include menuselect.makeopts
|
||||
endif
|
||||
|
||||
ifneq ($(wildcard ~/.asterisk.makeopts),)
|
||||
include ~/.asterisk.makeopts
|
||||
ifneq ($(wildcard makeopts),)
|
||||
include makeopts
|
||||
endif
|
||||
|
||||
ASTCFLAGS+=$(MENUSELECT_CFLAGS)
|
||||
TOPDIR_CFLAGS=-include include/autoconfig.h
|
||||
MOD_SUBDIR_CFLAGS=-include ../include/autoconfig.h
|
||||
|
||||
# *CLI> show memory allocations [filename]
|
||||
# *CLI> show memory summary [filename]
|
||||
ifneq ($(findstring -DMALLOC_DEBUG,$(ASTCFLAGS)),)
|
||||
TOPDIR_CFLAGS+=-include include/asterisk/astmm.h
|
||||
MOD_SUBDIR_CFLAGS+=-include ../include/asterisk/astmm.h
|
||||
endif
|
||||
|
||||
MOD_SUBDIR_CFLAGS+=-fPIC
|
||||
|
||||
ifeq ($(OSARCH),Linux)
|
||||
ifeq ($(PROC),x86_64)
|
||||
# You must have GCC 3.4 to use k8, otherwise use athlon
|
||||
|
@ -247,9 +253,13 @@ ifeq ($(OSARCH),SunOS)
|
|||
endif
|
||||
|
||||
INCLUDE+=-Iinclude -I../include
|
||||
ASTCFLAGS+=-pipe -Wall -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations $(DEBUG) $(INCLUDE) -D_REENTRANT -D_GNU_SOURCE #-DMAKE_VALGRIND_HAPPY
|
||||
ASTCFLAGS+=-pipe -Wall -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations $(DEBUG) $(INCLUDE) #-DMAKE_VALGRIND_HAPPY
|
||||
ASTCFLAGS+=$(OPTIMIZE)
|
||||
ASTCFLAGS+=# -Werror -Wunused
|
||||
|
||||
ifeq ($(AST_DEVMODE),yes)
|
||||
ASTCFLAGS+=-Werror -Wunused
|
||||
endif
|
||||
|
||||
ifeq ($(shell gcc -v 2>&1 | grep 'gcc version' | cut -f3 -d' ' | cut -f1 -d.),4)
|
||||
ASTCFLAGS+= -Wno-pointer-sign
|
||||
endif
|
||||
|
@ -267,14 +277,6 @@ ifeq ($(PROC),ppc)
|
|||
ASTCFLAGS+=-fsigned-char
|
||||
endif
|
||||
|
||||
ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/local/include/osp/osp.h),)
|
||||
ASTCFLAGS+=-DOSP_SUPPORT -I$(CROSS_COMPILE_TARGET)/usr/local/include/osp
|
||||
else
|
||||
ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/osp/osp.h),)
|
||||
ASTCFLAGS+=-DOSP_SUPPORT -I$(CROSS_COMPILE_TARGET)/usr/include/osp
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(OSARCH),FreeBSD)
|
||||
BSDVERSION=$(shell make -V OSVERSION -f $(CROSS_COMPILE_TARGET)/usr/share/mk/bsd.port.subdir.mk)
|
||||
ASTCFLAGS+=$(shell if test $(BSDVERSION) -lt 500016 ; then echo "-D_THREAD_SAFE"; fi)
|
||||
|
@ -300,27 +302,11 @@ ifeq ($(OSARCH),SunOS)
|
|||
INCLUDE+=-Iinclude/solaris-compat -I$(CROSS_COMPILE_TARGET)/usr/local/ssl/include
|
||||
endif
|
||||
|
||||
ifeq ($(findstring CYGWIN,$(OSARCH)),CYGWIN)
|
||||
CYGLOADER=cygwin_a
|
||||
OSARCH=CYGWIN
|
||||
ASTOBJ=-shared -o asterisk.dll -Wl,--out-implib=libasterisk.dll.a -Wl,--export-all-symbols
|
||||
ASTLINK=
|
||||
LIBS+=-lpthread -lncurses -lm -lresolv
|
||||
ASTSBINDIR=$(MODULES_DIR)
|
||||
endif
|
||||
|
||||
ifndef WITHOUT_ZAPTEL
|
||||
|
||||
ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/linux/zaptel.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/local/include/zaptel.h)$(wildcard $(CROSS_COMPILE_TARGET)/usr/pkg/include/zaptel.h),)
|
||||
ASTCFLAGS+=-DZAPTEL_OPTIMIZATIONS
|
||||
endif
|
||||
|
||||
endif # WITHOUT_ZAPTEL
|
||||
|
||||
LIBEDIT=editline/libedit.a
|
||||
|
||||
ASTERISKVERSION:=$(shell build_tools/make_version .)
|
||||
|
||||
ifneq ($(wildcard .version),)
|
||||
ASTERISKVERSION:=$(shell cat .version)
|
||||
ASTERISKVERSIONNUM:=$(shell awk -F. '{printf "%02d%02d%02d", $$1, $$2, $$3}' .version)
|
||||
RPMVERSION:=$(shell sed 's/[-\/:]/_/g' .version)
|
||||
else
|
||||
|
@ -332,11 +318,9 @@ endif
|
|||
# showing the branch they are made from
|
||||
ifneq ($(wildcard .svnrevision),)
|
||||
ASTERISKVERSIONNUM=999999
|
||||
ASTERISKVERSION:=SVN-$(shell cat .svnbranch)-r$(shell cat .svnrevision)
|
||||
else
|
||||
ifneq ($(wildcard .svn),)
|
||||
ASTERISKVERSIONNUM=999999
|
||||
ASTERISKVERSION=SVN-$(shell build_tools/make_svn_branch_name)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
@ -345,11 +329,12 @@ ASTCFLAGS+= $(TRACE_FRAMES)
|
|||
ASTCFLAGS+= $(MALLOC_DEBUG)
|
||||
ASTCFLAGS+= $(BUSYDETECT)
|
||||
ASTCFLAGS+= $(OPTIONS)
|
||||
ifneq ($(findstring dont-optimize,$(MAKECMDGOALS)),dont-optimize)
|
||||
ifeq ($(findstring dont-optimize,$(MAKECMDGOALS)),)
|
||||
ASTCFLAGS+= -fomit-frame-pointer
|
||||
endif
|
||||
|
||||
SUBDIRS=res channels pbx apps codecs formats agi cdr funcs utils stdtime
|
||||
MOD_SUBDIRS=res channels pbx apps codecs formats cdr funcs
|
||||
SUBDIRS:=$(MOD_SUBDIRS) utils stdtime agi
|
||||
|
||||
OBJS=io.o sched.o logger.o frame.o loader.o config.o channel.o \
|
||||
translate.o file.o pbx.o cli.o md5.o term.o \
|
||||
|
@ -426,11 +411,11 @@ ifeq ($(OSARCH),SunOS)
|
|||
endif
|
||||
|
||||
ifeq ($(MAKETOPLEVEL),$(MAKELEVEL))
|
||||
CFLAGS+=$(ASTCFLAGS)
|
||||
CFLAGS+=$(ASTCFLAGS) $(TOPDIR_CFLAGS)
|
||||
endif
|
||||
|
||||
# This is used when generating the doxygen documentation
|
||||
ifneq ($(wildcard /usr/local/bin/dot)$(wildcard /usr/bin/dot),)
|
||||
ifneq ($(DOT),:)
|
||||
HAVEDOT=yes
|
||||
else
|
||||
HAVEDOT=no
|
||||
|
@ -438,18 +423,38 @@ endif
|
|||
|
||||
INSTALL=install
|
||||
|
||||
CFLAGS+=-DT38_SUPPORT
|
||||
|
||||
_all: all
|
||||
@echo " +--------- Asterisk Build Complete ---------+"
|
||||
@echo " + Asterisk has successfully been built, but +"
|
||||
@echo " + cannot be run before being installed by +"
|
||||
@echo " + running: +"
|
||||
@echo " + +"
|
||||
@echo " + $(MAKE) install +"
|
||||
@echo " + make install +"
|
||||
@echo " +-------------------------------------------+"
|
||||
|
||||
all: cleantest depend asterisk subdirs
|
||||
all: include/autoconfig.h menuselect.makeopts cleantest depend asterisk subdirs
|
||||
|
||||
configure:
|
||||
-@./bootstrap.sh
|
||||
|
||||
include/autoconfig.h: configure
|
||||
@CFLAGS="" ./configure
|
||||
@echo "****"
|
||||
@echo "**** The configure script was just executed, so 'make' needs to be"
|
||||
@echo "**** restarted."
|
||||
@echo "****"
|
||||
@echo exit 1
|
||||
|
||||
makeopts: configure
|
||||
@CFLAGS="" ./configure
|
||||
@echo "****"
|
||||
@echo "**** The configure script was just executed, so 'make' needs to be"
|
||||
@echo "**** restarted."
|
||||
@echo "****"
|
||||
@echo exit 1
|
||||
|
||||
menuselect.makeopts: build_tools/menuselect makeopts.xml
|
||||
@build_tools/menuselect --check-deps ${GLOBAL_MAKEOPTS} ${USER_MAKEOPTS} $@
|
||||
|
||||
#ifneq ($(wildcard tags),)
|
||||
ctags: tags
|
||||
|
@ -459,16 +464,14 @@ ifneq ($(wildcard TAGS),)
|
|||
all: TAGS
|
||||
endif
|
||||
|
||||
noclean: depend asterisk subdirs
|
||||
|
||||
editline/config.h:
|
||||
cd editline && unset CFLAGS LIBS && ./configure ; \
|
||||
|
||||
editline/libedit.a: FORCE
|
||||
editline/libedit.a:
|
||||
cd editline && unset CFLAGS LIBS && test -f config.h || ./configure
|
||||
$(MAKE) -C editline libedit.a
|
||||
|
||||
db1-ast/libdb1.a: FORCE
|
||||
db1-ast/libdb1.a:
|
||||
$(MAKE) -C db1-ast libdb1.a
|
||||
|
||||
ifneq ($(wildcard .depend),)
|
||||
|
@ -511,27 +514,24 @@ asterisk.html: asterisk.sgml
|
|||
asterisk.txt: asterisk.sgml
|
||||
docbook2txt asterisk.sgml
|
||||
|
||||
defaults.h: FORCE
|
||||
defaults.h: makeopts
|
||||
build_tools/make_defaults_h > $@.tmp
|
||||
if cmp -s $@.tmp $@ ; then echo ; else \
|
||||
mv $@.tmp $@ ; \
|
||||
fi
|
||||
rm -f $@.tmp
|
||||
|
||||
include/asterisk/version.h: FORCE
|
||||
include/asterisk/version.h:
|
||||
build_tools/make_version_h > $@.tmp
|
||||
if cmp -s $@.tmp $@ ; then echo; else \
|
||||
mv $@.tmp $@ ; \
|
||||
fi
|
||||
rm -f $@.tmp
|
||||
|
||||
stdtime/libtime.a: FORCE
|
||||
$(MAKE) -C stdtime libtime.a
|
||||
stdtime/libtime.a:
|
||||
CFLAGS="$(ASTCFLAGS) $(MOD_SUBDIR_CFLAGS)" $(MAKE) -C stdtime libtime.a
|
||||
|
||||
cygwin_a:
|
||||
$(MAKE) -C cygwin all
|
||||
|
||||
asterisk: $(CYGLOADER) editline/libedit.a db1-ast/libdb1.a stdtime/libtime.a $(OBJS)
|
||||
asterisk: editline/libedit.a db1-ast/libdb1.a stdtime/libtime.a $(OBJS)
|
||||
build_tools/make_build_h > include/asterisk/build.h.tmp
|
||||
if cmp -s include/asterisk/build.h.tmp include/asterisk/build.h ; then echo ; else \
|
||||
mv include/asterisk/build.h.tmp include/asterisk/build.h ; \
|
||||
|
@ -544,7 +544,9 @@ muted: muted.o
|
|||
$(CC) $(AUDIO_LIBS) -o muted muted.o
|
||||
|
||||
subdirs:
|
||||
for x in $(SUBDIRS); do $(MAKE) -C $$x || exit 1 ; done
|
||||
for x in $(MOD_SUBDIRS); do CFLAGS="$(ASTCFLAGS) $(MOD_SUBDIR_CFLAGS)" $(MAKE) -C $$x || exit 1 ; done
|
||||
CFLAGS="$(ASTCFLAGS)" $(MAKE) -C utils
|
||||
CFLAGS="$(ASTCFLAGS) -include ../include/autoconfig.h" $(MAKE) -C agi
|
||||
|
||||
clean-depend:
|
||||
for x in $(SUBDIRS); do $(MAKE) -C $$x clean-depend || exit 1 ; done
|
||||
|
@ -562,11 +564,18 @@ clean: clean-depend
|
|||
$(MAKE) -C db1-ast clean
|
||||
$(MAKE) -C stdtime clean
|
||||
|
||||
dist-clean: clean
|
||||
rm -f menuselect.makeopts makeopts makeopts.xml
|
||||
rm -f config.log config.status
|
||||
rm -f include/autoconfig.h
|
||||
$(MAKE) -C mxml clean
|
||||
$(MAKE) -C build_tools dist-clean
|
||||
|
||||
datafiles: all
|
||||
if [ x`$(ID) -un` = xroot ]; then sh build_tools/mkpkgconfig $(DESTDIR)/usr/lib/pkgconfig; fi
|
||||
# Should static HTTP be installed during make samples or even with its own target ala
|
||||
# webvoicemail? There are portions here that *could* be customized but might also be
|
||||
# improved a lot. I'll put it here for now.
|
||||
# Should static HTTP be installed during make samples or even with its own target ala
|
||||
# webvoicemail? There are portions here that *could* be customized but might also be
|
||||
# improved a lot. I'll put it here for now.
|
||||
mkdir -p $(DESTDIR)$(ASTDATADIR)/static-http
|
||||
for x in static-http/*; do \
|
||||
install -m 644 $$x $(DESTDIR)$(ASTDATADIR)/static-http ; \
|
||||
|
@ -664,7 +673,6 @@ bininstall: all
|
|||
mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/meetme
|
||||
mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/monitor
|
||||
if [ -f asterisk ]; then $(INSTALL) -m 755 asterisk $(DESTDIR)$(ASTSBINDIR)/; fi
|
||||
if [ -f cygwin/asterisk.exe ]; then $(INSTALL) -m 755 cygwin/asterisk.exe $(DESTDIR)$(ASTSBINDIR)/; fi
|
||||
if [ -f asterisk.dll ]; then $(INSTALL) -m 755 asterisk.dll $(DESTDIR)$(ASTSBINDIR)/; fi
|
||||
ln -sf asterisk $(DESTDIR)$(ASTSBINDIR)/rasterisk
|
||||
$(INSTALL) -m 755 contrib/scripts/astgenkey $(DESTDIR)$(ASTSBINDIR)/
|
||||
|
@ -887,7 +895,7 @@ valgrind: dont-optimize
|
|||
depend: include/asterisk/version.h .depend defaults.h
|
||||
for x in $(SUBDIRS); do $(MAKE) -C $$x depend || exit 1 ; done
|
||||
|
||||
.depend: include/asterisk/version.h
|
||||
.depend: include/asterisk/version.h defaults.h
|
||||
build_tools/mkdep $(CFLAGS) $(wildcard *.c)
|
||||
|
||||
.tags-depend:
|
||||
|
@ -928,7 +936,6 @@ env:
|
|||
# If the cleancount has been changed, force a make clean.
|
||||
# .cleancount is the global clean count, and .lastclean is the
|
||||
# last clean count we had
|
||||
# We can avoid this by making noclean
|
||||
|
||||
cleantest:
|
||||
if cmp -s .cleancount .lastclean ; then echo ; else \
|
||||
|
@ -967,3 +974,17 @@ uninstall-all: _uninstall
|
|||
rm -rf $(DESTDIR)$(ASTSPOOLDIR)
|
||||
rm -rf $(DESTDIR)$(ASTETCDIR)
|
||||
rm -rf $(DESTDIR)$(ASTLOGDIR)
|
||||
|
||||
menuselect: build_tools/menuselect makeopts.xml
|
||||
-@build_tools/menuselect ${GLOBAL_MAKEOPTS} ${USER_MAKEOPTS} menuselect.makeopts && echo "menuselect changes saved!" || echo "menuselect changes NOT saved!"
|
||||
|
||||
build_tools/menuselect: build_tools/menuselect.c build_tools/menuselect.h mxml/libmxml.a
|
||||
$(MAKE) -C build_tools menuselect
|
||||
|
||||
mxml/libmxml.a:
|
||||
@cd mxml && unset CFLAGS && test -f config.h || ./configure
|
||||
$(MAKE) -C mxml libmxml.a
|
||||
|
||||
makeopts.xml: $(foreach dir,$(MOD_SUBDIRS),$(dir)/*.c) build_tools/cflags.xml
|
||||
@echo "Generating list of available modules ..."
|
||||
@build_tools/prep_moduledeps > $@
|
||||
|
|
32
UPGRADE.txt
32
UPGRADE.txt
|
@ -1,6 +1,38 @@
|
|||
Information for Upgrading From Previous Asterisk Releases
|
||||
=========================================================
|
||||
|
||||
Build Process (configure script):
|
||||
|
||||
Asterisk now uses an autoconf-generated configuration script to learn how it
|
||||
should build itself for your system. As it is a standard script, running:
|
||||
|
||||
$ ./configure --help
|
||||
|
||||
will show you all the options available. This script can be used to tell the
|
||||
build process what libraries you have on your system (if it cannot find them
|
||||
automatically), which libraries you wish to have ignored even though they may
|
||||
be present, etc.
|
||||
|
||||
You must run the configure script before Asterisk will build, although it will
|
||||
attempt to automatically run it for you with no options specified; for most users,
|
||||
that will result in a similar build to what they would have had before the
|
||||
configure script was added to the build process (except for having to run 'make'
|
||||
again after the configure script is run). Note that the configure script does NOT
|
||||
need to be re-run just to rebuild Asterisk; you only need to re-run it when your
|
||||
system configuration changes or you wish to build Asterisk with different options.
|
||||
|
||||
Build Process (module selection):
|
||||
|
||||
The Asterisk source tree now includes a basic module selection and build option
|
||||
selection tool called 'menuselect'. Run 'make menuselect' to make your choices.
|
||||
In this tool, you can disable building of modules that you don't care about,
|
||||
turn on/off global options for the build and see which modules will not (and cannot)
|
||||
be built because your system does not have the required external dependencies
|
||||
installed.
|
||||
|
||||
(TODO: document where 'global' and 'per-user' menuselect input files should go
|
||||
and what they need to contain)
|
||||
|
||||
PBX Core:
|
||||
|
||||
* The (very old and undocumented) ability to use BYEXTENSION for dialing
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
# AST_EXT_LIB([NAME], [FUNCTION], [package header], [package symbol name], [package friendly name], [additional LIB data])
|
||||
|
||||
AC_DEFUN([AST_EXT_LIB],
|
||||
[
|
||||
AC_ARG_WITH([$1], AC_HELP_STRING([--with-$1=PATH],[use $5 files in PATH]),[
|
||||
case ${withval} in
|
||||
n|no)
|
||||
USE_$1=no
|
||||
;;
|
||||
y|ye|yes)
|
||||
$1_MANDATORY="yes"
|
||||
;;
|
||||
*)
|
||||
$1_DIR="${withval}"
|
||||
$1_MANDATORY="yes"
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
PBX_LIB$1=0
|
||||
|
||||
if test "${USE_$1}" != "no"; then
|
||||
AC_CHECK_LIB([$1], [$2], AC_DEFINE_UNQUOTED([HAVE_$4], 1,
|
||||
[Define to indicate the $5 library]), [], -L${$1_DIR}/lib $6)
|
||||
|
||||
if test "${ac_cv_lib_$1_$2}" = "yes"; then
|
||||
$1_LIB="-l$1 $6"
|
||||
$4_HEADER_FOUND="1"
|
||||
if test "x${$1_DIR}" != "x"; then
|
||||
$1_LIB="-L${$1_DIR}/lib ${$1_LIB}"
|
||||
$1_INCLUDE="-I${$1_DIR}/include"
|
||||
if test "x$3" != "x" ; then
|
||||
AC_CHECK_HEADER([${$1_DIR}/include/$3], [$4_HEADER_FOUND=1], [$4_HEADER_FOUND=0] )
|
||||
fi
|
||||
else
|
||||
if test "x$3" != "x" ; then
|
||||
AC_CHECK_HEADER([$3], [$4_HEADER_FOUND=1], [$4_HEADER_FOUND=0] )
|
||||
fi
|
||||
fi
|
||||
if test "x${$4_HEADER_FOUND}" = "x0" ; then
|
||||
echo " ***"
|
||||
echo " *** It appears that you do not have the $5 development package installed."
|
||||
echo " *** Please install it to include $5 support, or re-run configure"
|
||||
echo " *** with the argument --without-$1"
|
||||
exit 1
|
||||
fi
|
||||
PBX_LIB$1=1
|
||||
elif test ! -z "${$1_MANDATORY}";
|
||||
then
|
||||
echo "***"
|
||||
echo "*** The $5 installation on this system appears to be broken."
|
||||
echo "*** Either correct the installation, or run configure"
|
||||
echo "*** including --without-$1"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
AC_SUBST([$1_LIB])
|
||||
AC_SUBST([$1_INCLUDE])
|
||||
AC_SUBST([PBX_LIB$1])
|
||||
])
|
||||
|
||||
|
||||
AC_DEFUN(
|
||||
[AST_CHECK_GNU_MAKE], [ AC_CACHE_CHECK( for GNU make, GNU_MAKE,
|
||||
GNU_MAKE='Not Found' ;
|
||||
for a in make gmake gnumake ; do
|
||||
if test -z "$a" ; then continue ; fi ;
|
||||
if ( sh -c "$a --version" 2> /dev/null | grep GNU 2>&1 > /dev/null ) ; then
|
||||
GNU_MAKE=$a ;
|
||||
break;
|
||||
fi
|
||||
done ;
|
||||
) ;
|
||||
if test "x$GNU_MAKE" = "xNot Found" ; then
|
||||
echo " *** Please install GNU make. It is required to build Asterisk!"
|
||||
exit 1
|
||||
fi
|
||||
AC_SUBST([GNU_MAKE])
|
||||
] )
|
|
@ -3,7 +3,7 @@
|
|||
#
|
||||
# Makefile for AGI-related stuff
|
||||
#
|
||||
# Copyright (C) 1999-2005, Digium
|
||||
# Copyright (C) 1999-2006, Digium
|
||||
#
|
||||
# Mark Spencer <markster@digium.com>
|
||||
#
|
||||
|
@ -13,8 +13,6 @@
|
|||
|
||||
AGIS=agi-test.agi eagi-test eagi-sphinx-test jukebox.agi
|
||||
|
||||
CFLAGS+=-DNO_AST_MM
|
||||
|
||||
LIBS=
|
||||
ifeq ($(OSARCH),SunOS)
|
||||
LIBS=-lsocket -lnsl ../strcompat.o
|
||||
|
@ -30,10 +28,10 @@ uninstall:
|
|||
for x in $(AGIS); do rm -f $(DESTDIR)$(AGI_DIR)/$$x ; done
|
||||
|
||||
eagi-test: eagi-test.o
|
||||
$(CC) $(CFLAGS) -o eagi-test eagi-test.o $(LIBS)
|
||||
$(CC) $(CFLAGS) -include ../include/autoconfig.h -o eagi-test eagi-test.o $(LIBS)
|
||||
|
||||
eagi-sphinx-test: eagi-sphinx-test.o
|
||||
$(CC) $(CFLAGS) -o eagi-sphinx-test eagi-sphinx-test.o $(LIBS)
|
||||
$(CC) $(CFLAGS) -include ../include/autoconfig.h -o eagi-sphinx-test eagi-sphinx-test.o $(LIBS)
|
||||
|
||||
clean-depend:
|
||||
rm -f .depend
|
||||
|
|
|
@ -17,7 +17,10 @@
|
|||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <asterisk/compat.h>
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
#include "asterisk/compat.h"
|
||||
|
||||
#define AUDIO_FILENO (STDERR_FILENO + 1)
|
||||
|
||||
|
|
|
@ -11,7 +11,10 @@
|
|||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <sys/select.h>
|
||||
#include <asterisk/compat.h>
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
#include "asterisk/compat.h"
|
||||
|
||||
#define AUDIO_FILENO (STDERR_FILENO + 1)
|
||||
|
||||
|
|
|
@ -11,39 +11,12 @@
|
|||
# the GNU General Public License
|
||||
#
|
||||
|
||||
MODS:=$(patsubst %.c,%.so,$(wildcard app_*.c))
|
||||
MODS:=$(filter-out $(MENUSELECT_APPS),$(patsubst %.c,%.so,$(wildcard app_*.c)))
|
||||
|
||||
#
|
||||
# Experimental things
|
||||
#
|
||||
MODS:=$(filter-out app_ivrdemo.so,$(MODS))
|
||||
MODS:=$(filter-out app_skel.so,$(MODS))
|
||||
MODS:=$(filter-out app_rpt.so,$(MODS))
|
||||
|
||||
ifndef WITHOUT_ZAPTEL
|
||||
ZAPAVAIL:=$(wildcard $(CROSS_COMPILE_TARGET)/usr/include/linux/zaptel.h $(CROSS_COMPILE_TARGET)/usr/local/include/zaptel.h)
|
||||
endif
|
||||
|
||||
ifeq (${ZAPAVAIL},)
|
||||
MODS:=$(filter-out app_zapras.so app_meetme.so app_flash.so app_zapbarge.so app_zapscan.so app_page.so,$(MODS))
|
||||
endif
|
||||
|
||||
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/local/include/osp/osp.h $(CROSS_COMPILE_TARGET)/usr/include/osp/osp.h),)
|
||||
MODS:=$(filter-out app_osplookup.so,$(MODS))
|
||||
endif
|
||||
|
||||
ifneq (${WITH_SMDI},)
|
||||
ifneq ($(WITH_SMDI),)
|
||||
CFLAGS+=-DWITH_SMDI
|
||||
endif
|
||||
|
||||
ifeq (${OSARCH},CYGWIN)
|
||||
CYGSOLINK=-Wl,--out-implib=lib$@.a -Wl,--export-all-symbols
|
||||
CYGSOLIB=-L.. -L. -L../res -lasterisk.dll -lres_features.so -lres_adsi.so -lres_monitor.so
|
||||
MODS:=$(filter-out app_sms.so,$(MODS))
|
||||
else
|
||||
CFLAGS+=-fPIC
|
||||
endif
|
||||
|
||||
# If you have UnixODBC you can use ODBC voicemail
|
||||
# storage
|
||||
#
|
||||
|
@ -61,11 +34,14 @@ clean-depend:
|
|||
clean: clean-depend
|
||||
rm -f *.so *.o
|
||||
|
||||
%.so : %.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB}
|
||||
%.so: %.o
|
||||
$(CC) $(SOLINK) -o $@ $<
|
||||
|
||||
app_rpt.so : app_rpt.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} -ltonezone
|
||||
app_rpt.so: app_rpt.o
|
||||
$(CC) $(SOLINK) -o $@ $< $(ZAPTEL_LIB)
|
||||
|
||||
app_rpt.o: app_rpt.c
|
||||
$(CC) $(SOLINK) -o $@ $< $(ZAPTEL_INCLUDE)
|
||||
|
||||
install: all
|
||||
for x in $(MODS); do $(INSTALL) -m 755 $$x $(DESTDIR)$(MODULES_DIR) ; done
|
||||
|
|
|
@ -25,6 +25,10 @@
|
|||
* \ingroup applications
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
***/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
@ -132,3 +136,4 @@ static const char *key(void)
|
|||
}
|
||||
|
||||
STD_MOD1;
|
||||
|
||||
|
|
|
@ -25,6 +25,10 @@
|
|||
* \ingroup applications
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<defaultenabled>no</defaultenabled>
|
||||
***/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
@ -137,3 +141,4 @@ static const char *key(void)
|
|||
}
|
||||
|
||||
STD_MOD1;
|
||||
|
||||
|
|
|
@ -26,6 +26,10 @@
|
|||
* \ingroup applications
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
***/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
@ -2469,5 +2473,6 @@ static const char *key(void)
|
|||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
||||
|
||||
STD_MOD(MOD_1, reload, NULL, NULL);
|
||||
|
||||
|
|
|
@ -25,6 +25,11 @@
|
|||
* \ingroup applications
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>libosptk</depend>
|
||||
<depend>ssl</depend>
|
||||
***/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
@ -637,3 +642,5 @@ static const char *key(void)
|
|||
}
|
||||
|
||||
STD_MOD1;
|
||||
|
||||
|
||||
|
|
|
@ -25,6 +25,10 @@
|
|||
* \ingroup applications
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
***/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
@ -230,3 +234,4 @@ static const char *key(void)
|
|||
}
|
||||
|
||||
STD_MOD1;
|
||||
|
||||
|
|
|
@ -95,6 +95,11 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
<defaultenabled>no</defaultenabled>
|
||||
***/
|
||||
|
||||
/* The following is JUST GROSS!! There is some soft of underlying problem,
|
||||
probably in channel_iax2.c, that causes an IAX2 connection to sometimes
|
||||
stop transmitting randomly. We have been working for weeks to try to
|
||||
|
@ -7063,3 +7068,4 @@ static const char *key(void)
|
|||
}
|
||||
|
||||
STD_MOD1;
|
||||
|
||||
|
|
|
@ -26,6 +26,10 @@
|
|||
* \ingroup applications
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<defaultenabled>no</defaultenabled>
|
||||
***/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
@ -141,3 +145,4 @@ static const char *key(void)
|
|||
}
|
||||
|
||||
STD_MOD1;
|
||||
|
||||
|
|
|
@ -31,6 +31,10 @@
|
|||
* \ingroup applications
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
***/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
@ -329,3 +333,4 @@ static const char *key(void)
|
|||
}
|
||||
|
||||
STD_MOD1;
|
||||
|
||||
|
|
|
@ -25,6 +25,10 @@
|
|||
* \ingroup applications
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
***/
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/wait.h>
|
||||
#ifdef __linux__
|
||||
|
@ -267,3 +271,4 @@ static const char *key(void)
|
|||
}
|
||||
|
||||
STD_MOD1;
|
||||
|
||||
|
|
|
@ -30,6 +30,10 @@
|
|||
* \ingroup applications
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
***/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
@ -390,3 +394,4 @@ static const char *key(void)
|
|||
}
|
||||
|
||||
STD_MOD1;
|
||||
|
||||
|
|
|
@ -143,8 +143,13 @@
|
|||
#include <errno.h>
|
||||
#include <regex.h>
|
||||
#include <limits.h>
|
||||
#include <asterisk/ast_expr.h>
|
||||
#include <asterisk/logger.h>
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
#include "asterisk/ast_expr.h"
|
||||
#include "asterisk/logger.h"
|
||||
|
||||
#if defined(LONG_LONG_MIN) && !defined(QUAD_MIN)
|
||||
#define QUAD_MIN LONG_LONG_MIN
|
||||
|
|
11
ast_expr2.fl
11
ast_expr2.fl
|
@ -36,9 +36,14 @@
|
|||
#include <errno.h>
|
||||
#include <regex.h>
|
||||
#include <limits.h>
|
||||
#include <asterisk/ast_expr.h>
|
||||
#include <asterisk/logger.h>
|
||||
#include <asterisk/strings.h>
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
#include "asterisk/ast_expr.h"
|
||||
#include "asterisk/logger.h"
|
||||
#include "asterisk/strings.h"
|
||||
|
||||
enum valtype {
|
||||
AST_EXPR_integer, AST_EXPR_numeric_string, AST_EXPR_string
|
||||
|
|
|
@ -26,8 +26,13 @@
|
|||
#include <errno.h>
|
||||
#include <regex.h>
|
||||
#include <limits.h>
|
||||
#include <asterisk/ast_expr.h>
|
||||
#include <asterisk/logger.h>
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
#include "asterisk/ast_expr.h"
|
||||
#include "asterisk/logger.h"
|
||||
|
||||
#if defined(LONG_LONG_MIN) && !defined(QUAD_MIN)
|
||||
#define QUAD_MIN LONG_LONG_MIN
|
||||
|
|
11
ast_expr2f.c
11
ast_expr2f.c
|
@ -1267,9 +1267,14 @@ static yyconst yy_state_type yy_NUL_trans[50] =
|
|||
#include <errno.h>
|
||||
#include <regex.h>
|
||||
#include <limits.h>
|
||||
#include <asterisk/ast_expr.h>
|
||||
#include <asterisk/logger.h>
|
||||
#include <asterisk/strings.h>
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
#include "asterisk/ast_expr.h"
|
||||
#include "asterisk/logger.h"
|
||||
#include "asterisk/strings.h"
|
||||
|
||||
enum valtype {
|
||||
AST_EXPR_integer, AST_EXPR_numeric_string, AST_EXPR_string
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
#!/bin/sh
|
||||
|
||||
check_for_app() {
|
||||
$1 --version 2>&1 >/dev/null
|
||||
if [ $? != 0 ]
|
||||
then
|
||||
echo "Please install $1 and run bootstrap.sh again!"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
uname -s | grep -q FreeBSD
|
||||
if [ $? = 0 ]
|
||||
then
|
||||
check_for_app aclocal19
|
||||
check_for_app autoconf259
|
||||
check_for_app autoheader259
|
||||
check_for_app automake19
|
||||
|
||||
aclocal19 2>/dev/null
|
||||
autoconf259
|
||||
autoheader259
|
||||
automake19 --add-missing --copy 2>/dev/null
|
||||
else
|
||||
export AUTOCONF_VERSION=2.59
|
||||
export AUTOMAKE_VERSION=1.9
|
||||
|
||||
check_for_app aclocal
|
||||
check_for_app autoconf
|
||||
check_for_app autoheader
|
||||
check_for_app automake
|
||||
|
||||
aclocal 2>/dev/null
|
||||
autoconf
|
||||
autoheader
|
||||
automake --add-missing --copy 2>/dev/null
|
||||
fi
|
|
@ -0,0 +1,18 @@
|
|||
MENUSELECT_OBJS=menuselect.o menuselect_curses.o
|
||||
MENUSELECT_CFLAGS=-g -c -D_GNU_SOURCE -I../ -I../include/
|
||||
MENUSELECT_LIBS=../mxml/libmxml.a $(CURSES_LIB)
|
||||
|
||||
menuselect: $(MENUSELECT_OBJS)
|
||||
$(CC) -g -o $@ $(MENUSELECT_OBJS) $(MENUSELECT_LIBS)
|
||||
|
||||
menuselect.o: menuselect.c menuselect.h
|
||||
$(CC) -o $@ $(MENUSELECT_CFLAGS) $<
|
||||
|
||||
menuselect_curses.o: menuselect_curses.c menuselect.h
|
||||
$(CC) -o $@ $(MENUSELECT_CFLAGS) $(CURSES_INCLUDE) $<
|
||||
|
||||
clean:
|
||||
rm -f menuselect *.o
|
||||
|
||||
dist-clean: clean
|
||||
rm -f menuselect-deps
|
|
@ -0,0 +1,23 @@
|
|||
<category name="MENUSELECT_CFLAGS" displayname="Compiler Flags" positive_output="yes" force_clean_on_change="yes">
|
||||
<member name="-DDEBUG_SCHEDULER">
|
||||
</member>
|
||||
<member name="-DDEBUG_THREADS">
|
||||
</member>
|
||||
<member name="-DDETECT_DEADLOCKS">
|
||||
</member>
|
||||
<member name="-DDUMP_SCHEDULER">
|
||||
</member>
|
||||
<member name="-DLOW_MEMORY">
|
||||
</member>
|
||||
<member name="-DMALLOC_DEBUG">
|
||||
</member>
|
||||
<member name="-DRADIO_RELAX">
|
||||
</member>
|
||||
<member name="-DTRACE_FRAMES">
|
||||
</member>
|
||||
<member name="-DMTX_PROFILE">
|
||||
</member>
|
||||
<member name="-DT38_SUPPORT">
|
||||
<defaultenabled>yes</defaultenabled>
|
||||
</member>
|
||||
</category>
|
|
@ -0,0 +1,3 @@
|
|||
/\/\*\*\* MODULEINFO/ {printit=1; next}
|
||||
/\*\*\*\// {exit}
|
||||
// {if (printit) print}
|
|
@ -1,50 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
PARTS=`LANG=C svn info | grep URL | awk '{print $2;}' | sed -e 's:^.*/svn/asterisk/::' | sed -e 's:/: :g'`
|
||||
BRANCH=0
|
||||
TEAM=0
|
||||
|
||||
REV=`svnversion -c . | cut -d: -f2`
|
||||
|
||||
if [ "${PARTS}" = "trunk" ]
|
||||
then
|
||||
echo 'trunk'-r${REV}
|
||||
exit 0
|
||||
fi
|
||||
|
||||
for PART in $PARTS
|
||||
do
|
||||
if [ ${BRANCH} != 0 ]
|
||||
then
|
||||
RESULT="${RESULT}-${PART}"
|
||||
break
|
||||
fi
|
||||
|
||||
if [ ${TEAM} != 0 ]
|
||||
then
|
||||
RESULT="${RESULT}-${PART}"
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ "${PART}" = "branches" ]
|
||||
then
|
||||
BRANCH=1
|
||||
RESULT="branch"
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ "${PART}" = "tags" ]
|
||||
then
|
||||
BRANCH=1
|
||||
RESULT="tag"
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ "${PART}" = "team" ]
|
||||
then
|
||||
TEAM=1
|
||||
continue
|
||||
fi
|
||||
done
|
||||
|
||||
echo ${RESULT##-}-r${REV}
|
|
@ -0,0 +1,56 @@
|
|||
#!/bin/sh
|
||||
|
||||
if [ -f ${1}/.version ]; then
|
||||
cat ${1}.version
|
||||
elif [ -f ${1}/.svnrevision ]; then
|
||||
echo SVN-`cat ${1}/.svnbranch`-r`cat ${1}.svnrevision`
|
||||
elif [ -d .svn ]; then
|
||||
PARTS=`LANG=C svn info ${1} | grep URL | awk '{print $2;}' | sed -e s:^.*/svn/asterisk/:: | sed -e 's:/: :g'`
|
||||
BRANCH=0
|
||||
TEAM=0
|
||||
|
||||
REV=`svnversion -c ${1} | cut -d: -f2`
|
||||
|
||||
if [ "${PARTS}" = "trunk" ]
|
||||
then
|
||||
echo SVN-'trunk'-r${REV}
|
||||
exit 0
|
||||
fi
|
||||
|
||||
for PART in $PARTS
|
||||
do
|
||||
if [ ${BRANCH} != 0 ]
|
||||
then
|
||||
RESULT="${RESULT}-${PART}"
|
||||
break
|
||||
fi
|
||||
|
||||
if [ ${TEAM} != 0 ]
|
||||
then
|
||||
RESULT="${RESULT}-${PART}"
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ "${PART}" = "branches" ]
|
||||
then
|
||||
BRANCH=1
|
||||
RESULT="branch"
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ "${PART}" = "tags" ]
|
||||
then
|
||||
BRANCH=1
|
||||
RESULT="tag"
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ "${PART}" = "team" ]
|
||||
then
|
||||
TEAM=1
|
||||
continue
|
||||
fi
|
||||
done
|
||||
|
||||
echo SVN-${RESULT##-}-r${REV}
|
||||
fi
|
|
@ -0,0 +1,27 @@
|
|||
ASOUND=@PBX_LIBasound@
|
||||
CURL=@PBX_CURL@
|
||||
FREETDS=@PBX_LIBtds@
|
||||
GTK=@PBX_GTK@
|
||||
H323=@PBX_H323@
|
||||
KDE=@PBX_KDE@
|
||||
LIBMFCR2=@PBX_LIBmfcr2@
|
||||
LIBNEWT=@PBX_LIBnewt@
|
||||
LIBOSPTK=@PBX_LIBosptk@
|
||||
LIBPOPT=@PBX_LIBpopt@
|
||||
LIBPRI=@PBX_LIBpri@
|
||||
LIBSPEEX=@PBX_LIBspeex@
|
||||
LIBVORBIS=@PBX_LIBvorbis@
|
||||
NBS=@PBX_LIBnbs@
|
||||
OGG=@PBX_LIBogg@
|
||||
OSSAUDIO=@PBX_LIBossaudio@
|
||||
PGSQL=@PBX_LIBpq@
|
||||
PTLIB=@PBX_LIBPWLIB@
|
||||
QT=@PBX_QT@
|
||||
SQLITE=@PBX_LIBsqlite@
|
||||
SSL=@PBX_LIBssl@
|
||||
UNIXODBC=@PBX_LIBodbc@
|
||||
VPBAPI=@PBX_LIBvpb@
|
||||
WIN32=@OSISWIN32@
|
||||
ZLIB=@PBX_LIBz@
|
||||
ZAPTEL=@PBX_LIBtonezone@
|
||||
LIBGSM=@PBX_LIBgsm@
|
|
@ -0,0 +1,671 @@
|
|||
/*
|
||||
* Asterisk -- An open source telephony toolkit.
|
||||
*
|
||||
* Copyright (C) 2005 - 2006, Russell Bryant
|
||||
*
|
||||
* Russell Bryant <russell@digium.com>
|
||||
*
|
||||
* See http://www.asterisk.org for more information about
|
||||
* the Asterisk project. Please do not directly contact
|
||||
* any of the maintainers of this project for assistance;
|
||||
* the project provides a web site, mailing lists and IRC
|
||||
* channels for your use.
|
||||
*
|
||||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License Version 2. See the LICENSE file
|
||||
* at the top of the source tree.
|
||||
*/
|
||||
|
||||
/*
|
||||
* \file
|
||||
*
|
||||
* \author Russell Bryant <russell@digium.com>
|
||||
*
|
||||
* \brief A menu-driven system for Asterisk module selection
|
||||
*/
|
||||
|
||||
#include "autoconfig.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "mxml/mxml.h"
|
||||
#include "menuselect.h"
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
#include "asterisk/linkedlists.h"
|
||||
|
||||
#undef MENUSELECT_DEBUG
|
||||
|
||||
struct depend {
|
||||
/*! the name of the dependency */
|
||||
const char *name;
|
||||
/*! for linking */
|
||||
AST_LIST_ENTRY(depend) list;
|
||||
};
|
||||
|
||||
struct conflict {
|
||||
/*! the name of the conflict */
|
||||
const char *name;
|
||||
/*! for linking */
|
||||
AST_LIST_ENTRY(conflict) list;
|
||||
};
|
||||
|
||||
/*! The list of categories */
|
||||
struct categories categories = AST_LIST_HEAD_NOLOCK_INIT_VALUE;
|
||||
|
||||
/*!
|
||||
We have to maintain a pointer to the root of the trees generated from reading
|
||||
the build options XML files so that we can free it when we're done. We don't
|
||||
copy any of the information over from these trees. Our list is just a
|
||||
convenient mapping to the information contained in these lists with one
|
||||
additional piece of information - whether the build option is enabled or not.
|
||||
*/
|
||||
struct tree {
|
||||
/*! the root of the tree */
|
||||
mxml_node_t *root;
|
||||
/*! for linking */
|
||||
AST_LIST_ENTRY(tree) list;
|
||||
};
|
||||
|
||||
/*! The list of trees from makeopts.xml files */
|
||||
AST_LIST_HEAD_NOLOCK_STATIC(trees, tree);
|
||||
|
||||
const char * const makeopts_files[] = {
|
||||
"makeopts.xml"
|
||||
};
|
||||
|
||||
char *output_makeopts = OUTPUT_MAKEOPTS_DEFAULT;
|
||||
|
||||
/*! This is set to 1 if menuselect.makeopts pre-existed the execution of this app */
|
||||
int existing_config = 0;
|
||||
|
||||
/*! This is set when the --check-deps argument is provided. */
|
||||
int check_deps = 0;
|
||||
|
||||
/*! Force a clean of the source tree */
|
||||
int force_clean = 0;
|
||||
|
||||
int add_category(struct category *cat);
|
||||
int add_member(struct member *mem, struct category *cat);
|
||||
int parse_makeopts_xml(const char *makeopts_xml);
|
||||
int process_deps(void);
|
||||
int build_member_list(void);
|
||||
void mark_as_present(const char *member, const char *category);
|
||||
int parse_existing_config(const char *infile);
|
||||
int generate_makeopts_file(void);
|
||||
void free_member_list(void);
|
||||
void free_trees(void);
|
||||
|
||||
/*! \brief a wrapper for calloc() that generates an error message if the allocation fails */
|
||||
static inline void *my_calloc(size_t num, size_t len)
|
||||
{
|
||||
void *tmp;
|
||||
|
||||
tmp = calloc(num, len);
|
||||
|
||||
if (!tmp)
|
||||
fprintf(stderr, "Memory allocation error!\n");
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/*! \brief return a pointer to the first non-whitespace character */
|
||||
static inline char *skip_blanks(char *str)
|
||||
{
|
||||
if (!str)
|
||||
return NULL;
|
||||
|
||||
while (*str && *str < 33)
|
||||
str++;
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
/*! \brief Add a category to the category list, ensuring that there are no duplicates */
|
||||
int add_category(struct category *cat)
|
||||
{
|
||||
struct category *tmp;
|
||||
|
||||
AST_LIST_TRAVERSE(&categories, tmp, list) {
|
||||
if (!strcmp(tmp->name, cat->name)) {
|
||||
fprintf(stderr, "Category '%s' specified more than once!\n", cat->name);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
AST_LIST_INSERT_TAIL(&categories, cat, list);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*! \brief Add a member to the member list of a category, ensuring that there are no duplicates */
|
||||
int add_member(struct member *mem, struct category *cat)
|
||||
{
|
||||
struct member *tmp;
|
||||
|
||||
AST_LIST_TRAVERSE(&cat->members, tmp, list) {
|
||||
if (!strcmp(tmp->name, mem->name)) {
|
||||
fprintf(stderr, "Member '%s' already exists in category '%s', ignoring.\n", mem->name, cat->name);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
AST_LIST_INSERT_TAIL(&cat->members, mem, list);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*! \brief Parse an input makeopts file */
|
||||
int parse_makeopts_xml(const char *makeopts_xml)
|
||||
{
|
||||
FILE *f;
|
||||
struct category *cat;
|
||||
struct tree *tree;
|
||||
struct member *mem;
|
||||
struct depend *dep;
|
||||
struct conflict *cnf;
|
||||
mxml_node_t *cur;
|
||||
mxml_node_t *cur2;
|
||||
mxml_node_t *cur3;
|
||||
mxml_node_t *menu;
|
||||
const char *tmp;
|
||||
|
||||
if (!(f = fopen(makeopts_xml, "r"))) {
|
||||
fprintf(stderr, "Unable to open '%s' for reading!\n", makeopts_xml);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!(tree = my_calloc(1, sizeof(*tree)))) {
|
||||
fclose(f);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!(tree->root = mxmlLoadFile(NULL, f, MXML_OPAQUE_CALLBACK))) {
|
||||
fclose(f);
|
||||
free(tree);
|
||||
return -1;
|
||||
}
|
||||
|
||||
AST_LIST_INSERT_HEAD(&trees, tree, list);
|
||||
|
||||
menu = mxmlFindElement(tree->root, tree->root, "menu", NULL, NULL, MXML_DESCEND);
|
||||
for (cur = mxmlFindElement(menu, menu, "category", NULL, NULL, MXML_DESCEND);
|
||||
cur;
|
||||
cur = mxmlFindElement(cur, menu, "category", NULL, NULL, MXML_DESCEND))
|
||||
{
|
||||
if (!(cat = my_calloc(1, sizeof(*cat))))
|
||||
return -1;
|
||||
|
||||
cat->name = mxmlElementGetAttr(cur, "name");
|
||||
cat->displayname = mxmlElementGetAttr(cur, "displayname");
|
||||
if ((tmp = mxmlElementGetAttr(cur, "positive_output")))
|
||||
cat->positive_output = !strcasecmp(tmp, "yes");
|
||||
if ((tmp = mxmlElementGetAttr(cur, "force_clean_on_change")))
|
||||
cat->force_clean_on_change = !strcasecmp(tmp, "yes");
|
||||
|
||||
if (add_category(cat)) {
|
||||
free(cat);
|
||||
continue;
|
||||
}
|
||||
|
||||
for (cur2 = mxmlFindElement(cur, cur, "member", NULL, NULL, MXML_DESCEND);
|
||||
cur2;
|
||||
cur2 = mxmlFindElement(cur2, cur, "member", NULL, NULL, MXML_DESCEND))
|
||||
{
|
||||
if (!(mem = my_calloc(1, sizeof(*mem))))
|
||||
return -1;
|
||||
|
||||
if (!cat->positive_output)
|
||||
mem->enabled = 1; /* Enabled by default */
|
||||
|
||||
mem->name = mxmlElementGetAttr(cur2, "name");
|
||||
|
||||
cur3 = mxmlFindElement(cur2, cur2, "defaultenabled", NULL, NULL, MXML_DESCEND);
|
||||
if (cur3 && cur3->child) {
|
||||
if (!strcasecmp("no", cur3->child->value.opaque))
|
||||
mem->enabled = 0;
|
||||
else if (!strcasecmp("yes", cur3->child->value.opaque))
|
||||
mem->enabled = 1;
|
||||
else
|
||||
fprintf(stderr, "Invalid value '%s' for <defaultenabled> !\n", cur3->child->value.opaque);
|
||||
}
|
||||
|
||||
for (cur3 = mxmlFindElement(cur2, cur2, "depend", NULL, NULL, MXML_DESCEND);
|
||||
cur3 && cur3->child;
|
||||
cur3 = mxmlFindElement(cur3, cur2, "depend", NULL, NULL, MXML_DESCEND))
|
||||
{
|
||||
if (!(dep = my_calloc(1, sizeof(*dep))))
|
||||
return -1;
|
||||
if (!strlen_zero(cur3->child->value.opaque)) {
|
||||
dep->name = cur3->child->value.opaque;
|
||||
AST_LIST_INSERT_HEAD(&mem->deps, dep, list);
|
||||
} else
|
||||
free(dep);
|
||||
}
|
||||
|
||||
for (cur3 = mxmlFindElement(cur2, cur2, "conflict", NULL, NULL, MXML_DESCEND);
|
||||
cur3 && cur3->child;
|
||||
cur3 = mxmlFindElement(cur3, cur2, "conflict", NULL, NULL, MXML_DESCEND))
|
||||
{
|
||||
if (!(cnf = my_calloc(1, sizeof(*cnf))))
|
||||
return -1;
|
||||
if (!strlen_zero(cur3->child->value.opaque)) {
|
||||
cnf->name = cur3->child->value.opaque;
|
||||
AST_LIST_INSERT_HEAD(&mem->conflicts, cnf, list);
|
||||
} else
|
||||
free(cnf);
|
||||
}
|
||||
|
||||
if (add_member(mem, cat))
|
||||
free(mem);
|
||||
}
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*! \brief Process dependencies against the input dependencies file */
|
||||
int process_deps(void)
|
||||
{
|
||||
struct category *cat;
|
||||
struct member *mem;
|
||||
struct depend *dep;
|
||||
struct conflict *cnf;
|
||||
FILE *f;
|
||||
struct dep_file {
|
||||
char name[32];
|
||||
int met;
|
||||
AST_LIST_ENTRY(dep_file) list;
|
||||
} *dep_file;
|
||||
AST_LIST_HEAD_NOLOCK_STATIC(deps_file, dep_file);
|
||||
char buf[80];
|
||||
char *p;
|
||||
int res = 0;
|
||||
|
||||
if (!(f = fopen(MENUSELECT_DEPS, "r"))) {
|
||||
fprintf(stderr, "Unable to open '%s' for reading! Did you run ./configure ?\n", MENUSELECT_DEPS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Build a dependency list from the file generated by configure */
|
||||
while (memset(buf, 0, sizeof(buf)), fgets(buf, sizeof(buf), f)) {
|
||||
p = buf;
|
||||
strsep(&p, "=");
|
||||
if (!p)
|
||||
continue;
|
||||
if (!(dep_file = my_calloc(1, sizeof(*dep_file))))
|
||||
break;
|
||||
strncpy(dep_file->name, buf, sizeof(dep_file->name) - 1);
|
||||
dep_file->met = atoi(p);
|
||||
AST_LIST_INSERT_TAIL(&deps_file, dep_file, list);
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
|
||||
/* Process dependencies of all modules */
|
||||
AST_LIST_TRAVERSE(&categories, cat, list) {
|
||||
AST_LIST_TRAVERSE(&cat->members, mem, list) {
|
||||
AST_LIST_TRAVERSE(&mem->deps, dep, list) {
|
||||
mem->depsfailed = 1;
|
||||
AST_LIST_TRAVERSE(&deps_file, dep_file, list) {
|
||||
if (!strcasecmp(dep_file->name, dep->name)) {
|
||||
if (dep_file->met)
|
||||
mem->depsfailed = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (mem->depsfailed)
|
||||
break; /* This dependency is not met, so we can stop now */
|
||||
}
|
||||
if (mem->depsfailed) {
|
||||
if (check_deps && existing_config && mem->enabled) {
|
||||
/* Config already existed, but this module was not disabled.
|
||||
* However, according to our current list of dependencies that
|
||||
* have been met, this can not be built. */
|
||||
res = -1;
|
||||
fprintf(stderr, "\nThe existing menuselect.makeopts did not specify that %s should not be built\n", mem->name);
|
||||
fprintf(stderr, "However, menuselect-deps indicates that dependencies for this module have not\n");
|
||||
fprintf(stderr, "been met. So, either remove the existing menuselect.makeopts file, or run\n");
|
||||
fprintf(stderr, "'make menuselect' to generate a file that is correct.\n\n");
|
||||
goto deps_file_free;
|
||||
}
|
||||
mem->enabled = 0; /* Automatically disable it if dependencies not met */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Process conflicts of all modules */
|
||||
AST_LIST_TRAVERSE(&categories, cat, list) {
|
||||
AST_LIST_TRAVERSE(&cat->members, mem, list) {
|
||||
AST_LIST_TRAVERSE(&mem->conflicts, cnf, list) {
|
||||
mem->conflictsfailed = 0;
|
||||
AST_LIST_TRAVERSE(&deps_file, dep_file, list) {
|
||||
if (!strcasecmp(dep_file->name, cnf->name)) {
|
||||
if (dep_file->met)
|
||||
mem->conflictsfailed = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (mem->conflictsfailed)
|
||||
break; /* This conflict was found, so we can stop now */
|
||||
}
|
||||
if (mem->conflictsfailed) {
|
||||
if (check_deps && existing_config && mem->enabled) {
|
||||
/* Config already existed, but this module was not disabled.
|
||||
* However, according to our current list of conflicts that
|
||||
* exist, this can not be built. */
|
||||
res = -1;
|
||||
fprintf(stderr, "\nThe existing menuselect.makeopts did not specify that %s should not be built\n", mem->name);
|
||||
fprintf(stderr, "However, menuselect-deps indicates that conflicts for this module exist.\n");
|
||||
fprintf(stderr, "So, either remove the existing menuselect.makeopts file, or run\n");
|
||||
fprintf(stderr, "'make menuselect' to generate a file that is correct.\n\n");
|
||||
goto deps_file_free;
|
||||
}
|
||||
mem->enabled = 0; /* Automatically disable it if conflicts exist */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
deps_file_free:
|
||||
|
||||
/* Free the dependency list we built from the file */
|
||||
while ((dep_file = AST_LIST_REMOVE_HEAD(&deps_file, list)))
|
||||
free(dep_file);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/*! \brief Iterate through all of the input makeopts files and call the parse function on them */
|
||||
int build_member_list(void)
|
||||
{
|
||||
int i;
|
||||
int res = -1;
|
||||
|
||||
for (i = 0; i < (sizeof(makeopts_files) / sizeof(makeopts_files[0])); i++) {
|
||||
if ((res = parse_makeopts_xml(makeopts_files[i]))) {
|
||||
fprintf(stderr, "Error parsing '%s'!\n", makeopts_files[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/*! \brief Given the string representation of a member and category, mark it as present in a given input file */
|
||||
void mark_as_present(const char *member, const char *category)
|
||||
{
|
||||
struct category *cat;
|
||||
struct member *mem;
|
||||
|
||||
AST_LIST_TRAVERSE(&categories, cat, list) {
|
||||
if (strcmp(category, cat->name))
|
||||
continue;
|
||||
AST_LIST_TRAVERSE(&cat->members, mem, list) {
|
||||
if (!strcmp(member, mem->name)) {
|
||||
mem->enabled = cat->positive_output;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!mem)
|
||||
fprintf(stderr, "member '%s' in category '%s' not found, ignoring.\n", member, category);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!cat)
|
||||
fprintf(stderr, "category '%s' not found! Can't mark '%s' as disabled.\n", category, member);
|
||||
}
|
||||
|
||||
/*! \brief Toggle a member of a category at the specified index to enabled/disabled */
|
||||
void toggle_enabled(struct category *cat, int index)
|
||||
{
|
||||
struct member *mem;
|
||||
int i = 0;
|
||||
|
||||
AST_LIST_TRAVERSE(&cat->members, mem, list) {
|
||||
if (i++ == index)
|
||||
break;
|
||||
}
|
||||
|
||||
if (mem && !(mem->depsfailed || mem->conflictsfailed)) {
|
||||
mem->enabled = !mem->enabled;
|
||||
if (cat->force_clean_on_change)
|
||||
force_clean = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*! \brief Parse an existing output makeopts file and enable members previously selected */
|
||||
int parse_existing_config(const char *infile)
|
||||
{
|
||||
FILE *f;
|
||||
char buf[2048];
|
||||
char *category, *parse, *member;
|
||||
int lineno = 0;
|
||||
|
||||
if (!(f = fopen(infile, "r"))) {
|
||||
#ifdef MENUSELECT_DEBUG
|
||||
/* This isn't really an error, so only print the message in debug mode */
|
||||
fprintf(stderr, "Unable to open '%s' for reading existing config.\n", infile);
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
while (fgets(buf, sizeof(buf), f)) {
|
||||
lineno++;
|
||||
|
||||
if (strlen_zero(buf))
|
||||
continue;
|
||||
|
||||
/* skip lines that are not for this tool */
|
||||
if (strncasecmp(buf, "MENUSELECT_", strlen("MENUSELECT_")))
|
||||
continue;
|
||||
|
||||
parse = buf;
|
||||
parse = skip_blanks(parse);
|
||||
if (strlen_zero(parse))
|
||||
continue;
|
||||
|
||||
/* Grab the category name */
|
||||
category = strsep(&parse, "=");
|
||||
if (!parse) {
|
||||
fprintf(stderr, "Invalid string in '%s' at line '%d'!\n", output_makeopts, lineno);
|
||||
continue;
|
||||
}
|
||||
|
||||
parse = skip_blanks(parse);
|
||||
while ((member = strsep(&parse, " \n"))) {
|
||||
member = skip_blanks(member);
|
||||
if (strlen_zero(member))
|
||||
continue;
|
||||
|
||||
mark_as_present(member, category);
|
||||
}
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*! \brief Create the output makeopts file that results from the user's selections */
|
||||
int generate_makeopts_file(void)
|
||||
{
|
||||
FILE *f;
|
||||
struct category *cat;
|
||||
struct member *mem;
|
||||
|
||||
if (!(f = fopen(output_makeopts, "w"))) {
|
||||
fprintf(stderr, "Unable to open build configuration file (%s) for writing!\n", output_makeopts);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Traverse all categories and members and output them as var/val pairs */
|
||||
AST_LIST_TRAVERSE(&categories, cat, list) {
|
||||
fprintf(f, "%s=", cat->name);
|
||||
AST_LIST_TRAVERSE(&cat->members, mem, list) {
|
||||
if ((!cat->positive_output && (!mem->enabled || mem->depsfailed || mem->conflictsfailed)) ||
|
||||
(cat->positive_output && mem->enabled && !mem->depsfailed && !mem->conflictsfailed))
|
||||
fprintf(f, "%s ", mem->name);
|
||||
}
|
||||
fprintf(f, "\n");
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef MENUSELECT_DEBUG
|
||||
/*! \brief Print out all of the information contained in our tree */
|
||||
void dump_member_list(void)
|
||||
{
|
||||
struct category *cat;
|
||||
struct member *mem;
|
||||
struct depend *dep;
|
||||
struct conflict *cnf;
|
||||
|
||||
AST_LIST_TRAVERSE(&categories, cat, list) {
|
||||
fprintf(stderr, "Category: '%s'\n", cat->name);
|
||||
AST_LIST_TRAVERSE(&cat->members, mem, list) {
|
||||
fprintf(stderr, " ==>> Member: '%s' (%s)\n", mem->name, mem->enabled ? "Enabled" : "Disabled");
|
||||
AST_LIST_TRAVERSE(&mem->deps, dep, list)
|
||||
fprintf(stderr, " --> Depends on: '%s'\n", dep->name);
|
||||
if (!AST_LIST_EMPTY(&mem->deps))
|
||||
fprintf(stderr, " --> Dependencies Met: %s\n", mem->depsfailed ? "No" : "Yes");
|
||||
AST_LIST_TRAVERSE(&mem->conflicts, cnf, list)
|
||||
fprintf(stderr, " --> Conflicts with: '%s'\n", cnf->name);
|
||||
if (!AST_LIST_EMPTY(&mem->conflicts))
|
||||
fprintf(stderr, " --> Conflicts Found: %s\n", mem->conflictsfailed ? "Yes" : "No");
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*! \brief Free all categories and their members */
|
||||
void free_member_list(void)
|
||||
{
|
||||
struct category *cat;
|
||||
struct member *mem;
|
||||
struct depend *dep;
|
||||
struct conflict *cnf;
|
||||
|
||||
while ((cat = AST_LIST_REMOVE_HEAD(&categories, list))) {
|
||||
while ((mem = AST_LIST_REMOVE_HEAD(&cat->members, list))) {
|
||||
while ((dep = AST_LIST_REMOVE_HEAD(&mem->deps, list)))
|
||||
free(dep);
|
||||
while ((cnf = AST_LIST_REMOVE_HEAD(&mem->conflicts, list)))
|
||||
free(cnf);
|
||||
free(mem);
|
||||
}
|
||||
free(cat);
|
||||
}
|
||||
}
|
||||
|
||||
/*! \brief Free all of the XML trees */
|
||||
void free_trees(void)
|
||||
{
|
||||
struct tree *tree;
|
||||
|
||||
while ((tree = AST_LIST_REMOVE_HEAD(&trees, list))) {
|
||||
mxmlDelete(tree->root);
|
||||
free(tree);
|
||||
}
|
||||
}
|
||||
|
||||
/*! \brief Enable/Disable all members of a category as long as dependencies have been met and no conflicts are found */
|
||||
void set_all(struct category *cat, int val)
|
||||
{
|
||||
struct member *mem;
|
||||
|
||||
AST_LIST_TRAVERSE(&cat->members, mem, list) {
|
||||
if (!(mem->depsfailed || mem->conflictsfailed))
|
||||
mem->enabled = val;
|
||||
}
|
||||
}
|
||||
|
||||
int count_categories(void)
|
||||
{
|
||||
struct category *cat;
|
||||
int count = 0;
|
||||
|
||||
AST_LIST_TRAVERSE(&categories, cat, list)
|
||||
count++;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
int count_members(struct category *cat)
|
||||
{
|
||||
struct member *mem;
|
||||
int count = 0;
|
||||
|
||||
AST_LIST_TRAVERSE(&cat->members, mem, list)
|
||||
count++;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int res = 0;
|
||||
unsigned int x;
|
||||
|
||||
/* Parse the input XML files to build the list of available options */
|
||||
if ((res = build_member_list()))
|
||||
exit(res);
|
||||
|
||||
/* The --check-deps option is used to ask this application to check to
|
||||
* see if that an existing menuselect.makeopts file contails all of the
|
||||
* modules that have dependencies that have not been met. If this
|
||||
* is not the case, an informative message will be printed to the
|
||||
* user and the build will fail. */
|
||||
for (x = 1; x < argc; x++) {
|
||||
if (!strcmp(argv[x], "--check-deps"))
|
||||
check_deps = 1;
|
||||
else {
|
||||
res = parse_existing_config(argv[x]);
|
||||
if (!res && !strcasecmp(argv[x], OUTPUT_MAKEOPTS_DEFAULT))
|
||||
existing_config = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Process module dependencies */
|
||||
res = process_deps();
|
||||
|
||||
#ifdef MENUSELECT_DEBUG
|
||||
/* Dump the list produced by parsing the various input files */
|
||||
dump_member_list();
|
||||
#endif
|
||||
|
||||
/* Run the menu to let the user enable/disable options */
|
||||
if (!check_deps && !res)
|
||||
res = run_menu();
|
||||
|
||||
/* Write out the menuselect.makeopts file if
|
||||
* 1) menuselect was not executed with --check-deps
|
||||
* 2) menuselect was executed with --check-deps but menuselect.makeopts
|
||||
* did not already exist.
|
||||
*/
|
||||
if ((!check_deps || !existing_config) && !res)
|
||||
res = generate_makeopts_file();
|
||||
|
||||
/* free everything we allocated */
|
||||
free_trees();
|
||||
free_member_list();
|
||||
|
||||
if (check_deps && !existing_config && !res) {
|
||||
fprintf(stderr, "\n***********************************************************\n");
|
||||
fprintf(stderr, "* menuselect.makeopts file generated with default values! *\n");
|
||||
fprintf(stderr, "* Please rerun make to build Asterisk. *\n");
|
||||
fprintf(stderr, "***********************************************************\n\n");
|
||||
res = -1;
|
||||
}
|
||||
|
||||
if (force_clean)
|
||||
unlink(".lastclean");
|
||||
|
||||
exit(res);
|
||||
}
|
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
* Asterisk -- An open source telephony toolkit.
|
||||
*
|
||||
* Copyright (C) 2005-2006, Russell Bryant
|
||||
*
|
||||
* Russell Bryant <russell@digium.com>
|
||||
*
|
||||
* See http://www.asterisk.org for more information about
|
||||
* the Asterisk project. Please do not directly contact
|
||||
* any of the maintainers of this project for assistance;
|
||||
* the project provides a web site, mailing lists and IRC
|
||||
* channels for your use.
|
||||
*
|
||||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License Version 2. See the LICENSE file
|
||||
* at the top of the source tree.
|
||||
*/
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
* \brief defaults for menuselect
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MENUSELECT_H
|
||||
#define MENUSELECT_H
|
||||
|
||||
#include "asterisk/linkedlists.h"
|
||||
|
||||
#define OUTPUT_MAKEOPTS_DEFAULT "menuselect.makeopts"
|
||||
#define MENUSELECT_DEPS "build_tools/menuselect-deps"
|
||||
|
||||
struct depend;
|
||||
struct conflict;
|
||||
|
||||
struct member {
|
||||
/*! What will be sent to the makeopts file */
|
||||
const char *name;
|
||||
/*! This module is currently selected */
|
||||
int enabled;
|
||||
/*! This module has failed dependencies */
|
||||
int depsfailed;
|
||||
/*! This module has failed conflicts */
|
||||
int conflictsfailed;
|
||||
/*! dependencies of this module */
|
||||
AST_LIST_HEAD_NOLOCK(, depend) deps;
|
||||
/*! conflicts of this module */
|
||||
AST_LIST_HEAD_NOLOCK(, conflict) conflicts;
|
||||
/*! for making a list of modules */
|
||||
AST_LIST_ENTRY(member) list;
|
||||
};
|
||||
|
||||
struct category {
|
||||
/*! the Makefile variable */
|
||||
const char *name;
|
||||
/*! the name displayed in the menu */
|
||||
const char *displayname;
|
||||
/*! Display what is selected, as opposed to not selected */
|
||||
int positive_output;
|
||||
/*! Force a clean of the source tree if anything in this category changes */
|
||||
int force_clean_on_change;
|
||||
/*! the list of possible values to be set in this variable */
|
||||
AST_LIST_HEAD_NOLOCK(, member) members;
|
||||
/*! for linking */
|
||||
AST_LIST_ENTRY(category) list;
|
||||
};
|
||||
|
||||
extern AST_LIST_HEAD_NOLOCK(categories, category) categories;
|
||||
|
||||
/*! This is implemented by the frontend */
|
||||
int run_menu(void);
|
||||
|
||||
int count_categories(void);
|
||||
|
||||
int count_members(struct category *cat);
|
||||
|
||||
/*! \brief Toggle a member of a category at the specified index to enabled/disabled */
|
||||
void toggle_enabled(struct category *cat, int index);
|
||||
|
||||
/*! \brief Enable/Disable all members of a category as long as dependencies have been met and no conflicts are found */
|
||||
void set_all(struct category *cat, int val);
|
||||
|
||||
/*! \brief returns non-zero if the string is not defined, or has zero length */
|
||||
static inline int strlen_zero(const char *s)
|
||||
{
|
||||
return (!s || (*s == '\0'));
|
||||
}
|
||||
|
||||
#endif /* MENUSELECT_H */
|
|
@ -0,0 +1,312 @@
|
|||
/*
|
||||
* Asterisk -- An open source telephony toolkit.
|
||||
*
|
||||
* Copyright (C) 2005 - 2006, Russell Bryant
|
||||
*
|
||||
* Russell Bryant <russell@digium.com>
|
||||
*
|
||||
* See http://www.asterisk.org for more information about
|
||||
* the Asterisk project. Please do not directly contact
|
||||
* any of the maintainers of this project for assistance;
|
||||
* the project provides a web site, mailing lists and IRC
|
||||
* channels for your use.
|
||||
*
|
||||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License Version 2. See the LICENSE file
|
||||
* at the top of the source tree.
|
||||
*/
|
||||
|
||||
/*
|
||||
* \file
|
||||
*
|
||||
* \author Russell Bryant <russell@digium.com>
|
||||
*
|
||||
* \brief curses frontend for Asterisk module selection
|
||||
*/
|
||||
|
||||
#include "autoconfig.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
#include <curses.h>
|
||||
|
||||
#include "menuselect.h"
|
||||
|
||||
#define MENU_TITLE1 "*************************************"
|
||||
#define MENU_TITLE2 "* Asterisk Module Selection *"
|
||||
#define MENU_TITLE3 "*************************************"
|
||||
|
||||
#define TITLE_HEIGHT 5
|
||||
|
||||
#define MIN_X 80
|
||||
#define MIN_Y 20
|
||||
|
||||
#define PAGE_OFFSET 10
|
||||
|
||||
|
||||
/*! Maximum number of characters horizontally */
|
||||
int max_x = 0;
|
||||
/*! Maximum number of characters vertically */
|
||||
int max_y = 0;
|
||||
|
||||
const char * const help_info[] = {
|
||||
"scroll => up/down arrows",
|
||||
"(de)select => Enter",
|
||||
"select all => F8",
|
||||
"deselect all => F7",
|
||||
"back => left arrow",
|
||||
"quit => q",
|
||||
"save and quit => x",
|
||||
"",
|
||||
"XXX means dependencies have not been met"
|
||||
};
|
||||
|
||||
void winch_handler(int sig);
|
||||
void show_help(WINDOW *win);
|
||||
void draw_main_menu(WINDOW *menu, int curopt);
|
||||
void draw_category_menu(WINDOW *menu, struct category *cat, int start, int end, int curopt);
|
||||
int run_category_menu(WINDOW *menu, int cat_num);
|
||||
int run_category_menu(WINDOW *menu, int cat_num);
|
||||
void draw_title_window(WINDOW *title);
|
||||
|
||||
/*! \brief Handle a window resize in xterm */
|
||||
void winch_handler(int sig)
|
||||
{
|
||||
getmaxyx(stdscr, max_y, max_x);
|
||||
|
||||
if (max_x < MIN_X - 1 || max_y < MIN_Y - 1) {
|
||||
fprintf(stderr, "Terminal must be at least 80 x 25.\n");
|
||||
max_x = MIN_X - 1;
|
||||
max_y = MIN_Y - 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*! \brief Display help information */
|
||||
void show_help(WINDOW *win)
|
||||
{
|
||||
int i;
|
||||
|
||||
wclear(win);
|
||||
for (i = 0; i < (sizeof(help_info) / sizeof(help_info[0])); i++) {
|
||||
wmove(win, i, max_x / 2 - 15);
|
||||
waddstr(win, help_info[i]);
|
||||
}
|
||||
wrefresh(win);
|
||||
getch(); /* display the help until the user hits a key */
|
||||
}
|
||||
|
||||
void draw_main_menu(WINDOW *menu, int curopt)
|
||||
{
|
||||
struct category *cat;
|
||||
char buf[64];
|
||||
int i = 0;
|
||||
|
||||
wclear(menu);
|
||||
|
||||
AST_LIST_TRAVERSE(&categories, cat, list) {
|
||||
wmove(menu, i++, max_x / 2 - 10);
|
||||
if (!strlen_zero(cat->displayname))
|
||||
snprintf(buf, sizeof(buf), "%d.%s %s", i, i < 10 ? " " : "", cat->displayname);
|
||||
else
|
||||
snprintf(buf, sizeof(buf), "%d.%s %s", i, i < 10 ? " " : "", cat->name);
|
||||
waddstr(menu, buf);
|
||||
}
|
||||
|
||||
wmove(menu, curopt, (max_x / 2) - 15);
|
||||
waddstr(menu, "--->");
|
||||
wmove(menu, 0, 0);
|
||||
|
||||
wrefresh(menu);
|
||||
}
|
||||
|
||||
void draw_category_menu(WINDOW *menu, struct category *cat, int start, int end, int curopt)
|
||||
{
|
||||
int i = 0;
|
||||
int j = 0;
|
||||
struct member *mem;
|
||||
char buf[64];
|
||||
|
||||
wclear(menu);
|
||||
|
||||
AST_LIST_TRAVERSE(&cat->members, mem, list) {
|
||||
if (i < start) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
wmove(menu, j++, max_x / 2 - 10);
|
||||
i++;
|
||||
if (mem->depsfailed)
|
||||
snprintf(buf, sizeof(buf), "XXX %d.%s %s", i, i < 10 ? " " : "", mem->name);
|
||||
else
|
||||
snprintf(buf, sizeof(buf), "[%s] %d.%s %s", mem->enabled ? "*" : " ", i, i < 10 ? " " : "", mem->name);
|
||||
waddstr(menu, buf);
|
||||
if (i == end)
|
||||
break;
|
||||
}
|
||||
|
||||
wmove(menu, curopt - start, max_x / 2 - 9);
|
||||
|
||||
wrefresh(menu);
|
||||
}
|
||||
|
||||
int run_category_menu(WINDOW *menu, int cat_num)
|
||||
{
|
||||
struct category *cat;
|
||||
int i = 0;
|
||||
int start = 0;
|
||||
int end = max_y - TITLE_HEIGHT - 2;
|
||||
int c;
|
||||
int curopt = 0;
|
||||
int maxopt;
|
||||
|
||||
AST_LIST_TRAVERSE(&categories, cat, list) {
|
||||
if (i++ == cat_num)
|
||||
break;
|
||||
}
|
||||
if (!cat)
|
||||
return -1;
|
||||
|
||||
maxopt = count_members(cat) - 1;
|
||||
|
||||
draw_category_menu(menu, cat, start, end, curopt);
|
||||
|
||||
while ((c = getch())) {
|
||||
switch (c) {
|
||||
case KEY_UP:
|
||||
if (curopt > 0) {
|
||||
curopt--;
|
||||
if (curopt < start) {
|
||||
start--;
|
||||
end--;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KEY_DOWN:
|
||||
if (curopt < maxopt) {
|
||||
curopt++;
|
||||
if (curopt > end - 1) {
|
||||
start++;
|
||||
end++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KEY_NPAGE:
|
||||
/* XXX Move down the list by PAGE_OFFSET */
|
||||
break;
|
||||
case KEY_PPAGE:
|
||||
/* XXX Move up the list by PAGE_OFFSET */
|
||||
break;
|
||||
case KEY_LEFT:
|
||||
return 0;
|
||||
case KEY_RIGHT:
|
||||
case KEY_ENTER:
|
||||
case '\n':
|
||||
case ' ':
|
||||
toggle_enabled(cat, curopt);
|
||||
break;
|
||||
case 'h':
|
||||
case 'H':
|
||||
show_help(menu);
|
||||
break;
|
||||
case KEY_F(7):
|
||||
set_all(cat, 0);
|
||||
break;
|
||||
case KEY_F(8):
|
||||
set_all(cat, 1);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (c == 'x' || c == 'q')
|
||||
break;
|
||||
draw_category_menu(menu, cat, start, end, curopt);
|
||||
}
|
||||
|
||||
wrefresh(menu);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
void draw_title_window(WINDOW *title)
|
||||
{
|
||||
wmove(title, 1, (max_x / 2) - (strlen(MENU_TITLE1) / 2));
|
||||
waddstr(title, MENU_TITLE1);
|
||||
wmove(title, 2, (max_x / 2) - (strlen(MENU_TITLE2) / 2));
|
||||
waddstr(title, MENU_TITLE2);
|
||||
wmove(title, 3, (max_x / 2) - (strlen(MENU_TITLE3) / 2));
|
||||
waddstr(title, MENU_TITLE3);
|
||||
wmove(title, 0, 0);
|
||||
wrefresh(title);
|
||||
}
|
||||
|
||||
|
||||
|
||||
int run_menu(void)
|
||||
{
|
||||
WINDOW *title;
|
||||
WINDOW *menu;
|
||||
int maxopt;
|
||||
int curopt = 0;
|
||||
int c;
|
||||
int res = 0;
|
||||
|
||||
initscr();
|
||||
getmaxyx(stdscr, max_y, max_x);
|
||||
signal(SIGWINCH, winch_handler); /* handle window resizing in xterm */
|
||||
|
||||
if (max_x < MIN_X - 1 || max_y < MIN_Y - 1) {
|
||||
fprintf(stderr, "Terminal must be at least %d x %d.\n", MIN_X, MIN_Y);
|
||||
endwin();
|
||||
return -1;
|
||||
}
|
||||
|
||||
cbreak(); /* don't buffer input until the enter key is pressed */
|
||||
noecho(); /* don't echo user input to the screen */
|
||||
keypad(stdscr, TRUE); /* allow the use of arrow keys */
|
||||
clear();
|
||||
refresh();
|
||||
|
||||
maxopt = count_categories() - 1;
|
||||
|
||||
/* We have two windows - the title window at the top, and the menu window gets the rest */
|
||||
title = newwin(TITLE_HEIGHT, max_x, 0, 0);
|
||||
menu = newwin(max_y - TITLE_HEIGHT, max_x, TITLE_HEIGHT, 0);
|
||||
draw_title_window(title);
|
||||
draw_main_menu(menu, curopt);
|
||||
|
||||
while ((c = getch())) {
|
||||
switch (c) {
|
||||
case KEY_UP:
|
||||
if (curopt > 0)
|
||||
curopt--;
|
||||
break;
|
||||
case KEY_DOWN:
|
||||
if (curopt < maxopt)
|
||||
curopt++;
|
||||
break;
|
||||
case KEY_RIGHT:
|
||||
case KEY_ENTER:
|
||||
case '\n':
|
||||
case ' ':
|
||||
c = run_category_menu(menu, curopt);
|
||||
break;
|
||||
case 'h':
|
||||
case 'H':
|
||||
show_help(menu);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (c == 'q') {
|
||||
res = -1;
|
||||
break;
|
||||
}
|
||||
if (c == 'x')
|
||||
break;
|
||||
draw_main_menu(menu, curopt);
|
||||
}
|
||||
|
||||
endwin();
|
||||
|
||||
return res;
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
#!/bin/sh
|
||||
|
||||
process_dir() {
|
||||
dir=${1}
|
||||
prefix=${2}_
|
||||
catsuffix=${3}
|
||||
displayname=${4}
|
||||
|
||||
echo -e "\t<category name=\"MENUSELECT_${catsuffix}\" displayname=\"${displayname}\">"
|
||||
for file in ${dir}/${prefix}*.c
|
||||
do
|
||||
fname=${file##${dir}/}
|
||||
echo -e "\t\t<member name=\"${fname%%.c}.so\">"
|
||||
awk -f build_tools/get_moduledeps ${file}
|
||||
echo -e "\t\t</member>"
|
||||
done
|
||||
echo -e "\t</category>"
|
||||
}
|
||||
|
||||
echo "<?xml version="1.0"?>"
|
||||
echo
|
||||
echo "<menu>"
|
||||
process_dir apps app APPS Applications
|
||||
process_dir cdr cdr CDR "Call Detail Recording"
|
||||
process_dir channels chan CHANNELS "Channel Drivers"
|
||||
process_dir codecs codec CODECS "Codec Translators"
|
||||
process_dir formats format FORMATS "Format Interpreters"
|
||||
process_dir funcs func FUNCS "Diaplan Functions"
|
||||
process_dir pbx pbx PBX "PBX Modules"
|
||||
process_dir res res RES "Resource Modules"
|
||||
cat build_tools/cflags.xml
|
||||
echo "</menu>"
|
106
cdr/Makefile
106
cdr/Makefile
|
@ -11,31 +11,7 @@
|
|||
# the GNU General Public License
|
||||
#
|
||||
|
||||
MODS:=$(patsubst %.c,%.so,$(wildcard cdr_*.c))
|
||||
|
||||
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/odbcinst.h $(CROSS_COMPILE_TARGET)/usr/local/include/odbcinst.h),)
|
||||
MODS:=$(filter-out cdr_odbc.so,$(MODS))
|
||||
endif
|
||||
|
||||
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/postgresql $(CROSS_COMPILE_TARGET)/usr/local/pgsql/include $(CROSS_COMPILE_TARGET)/usr/include/pgsql $(CROSS_COMPILE_TARGET)/usr/local/include/pgsql $(CROSS_COMPILE_TARGET)/opt/pgsql/include $(CROSS_COMPILE_TARGET)/usr/include/libpq-fe.h),)
|
||||
MODS:=$(filter-out cdr_pgsql.so,$(MODS))
|
||||
endif
|
||||
|
||||
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/sqlite.h),)
|
||||
MODS:=$(filter-out cdr_sqlite.so,$(MODS))
|
||||
endif
|
||||
|
||||
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/tds.h $(CROSS_COMPILE_TARGET)/usr/local/include/tds.h $(CROSS_COMPILE_TARGET)/usr/include/freetds/tds.h),)
|
||||
MODS:=$(filter-out cdr_tds.so,$(MODS))
|
||||
NOTDS=1
|
||||
endif
|
||||
|
||||
ifeq (${OSARCH},CYGWIN)
|
||||
CYGSOLINK=-Wl,--out-implib=lib$@.a -Wl,--export-all-symbols
|
||||
CYGSOLIB=-L.. -L. -lasterisk.dll
|
||||
else
|
||||
CFLAGS+=-fPIC
|
||||
endif
|
||||
MODS:=$(filter-out $(MENUSELECT_CDR),$(patsubst %.c,%.so,$(wildcard cdr_*.c)))
|
||||
|
||||
#The problem with sparc is the best stuff is in newer versions of gcc (post 3.0) only.
|
||||
#This works for even old (2.96) versions of gcc and provides a small boost either way.
|
||||
|
@ -47,7 +23,7 @@ ifeq ($(PROC),sparc64)
|
|||
CFLAGS += -mtune=$(PROC) -O3 -pipe -fomit-frame-pointer -mcpu=v8
|
||||
endif
|
||||
|
||||
ifeq (${NOTDS},)
|
||||
ifneq ($(TDS_LIB),)
|
||||
ifeq ($(shell grep -s TDS_VERSION_NO $(CROSS_COMPILE_TARGET)/usr/include/tdsver.h $(CROSS_COMPILE_TARGET)/usr/local/include/tdsver.h $(CROSS_COMPILE_TARGET)/usr/include/freetds/tdsver.h | grep -c 0.63),1)
|
||||
CFLAGS += -DFREETDS_0_63
|
||||
else
|
||||
|
@ -59,46 +35,6 @@ ifeq (${NOTDS},)
|
|||
endif
|
||||
endif
|
||||
|
||||
MLFLAGS=
|
||||
|
||||
ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/freetds),)
|
||||
CFLAGS+=-I$(CROSS_COMPILE_TARGET)/usr/include/freetds
|
||||
MLFLAGS+=-L$(CROSS_COMPILE_TARGET)/usr/lib/postgresql
|
||||
endif
|
||||
|
||||
ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/postgresql),)
|
||||
CFLAGS+=-I$(CROSS_COMPILE_TARGET)/usr/include/postgresql
|
||||
MLFLAGS+=-L$(CROSS_COMPILE_TARGET)/usr/lib/postgresql
|
||||
endif
|
||||
|
||||
ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/local/pgsql/include),)
|
||||
CFLAGS+=-I$(CROSS_COMPILE_TARGET)/usr/local/pgsql/include
|
||||
MLFLAGS+=-L$(CROSS_COMPILE_TARGET)/usr/local/pgsql/lib
|
||||
endif
|
||||
|
||||
ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/pgsql),)
|
||||
CFLAGS+=-I$(CROSS_COMPILE_TARGET)/usr/include/pgsql
|
||||
MLFLAGS+=-L$(CROSS_COMPILE_TARGET)/usr/lib/pgsql
|
||||
endif
|
||||
|
||||
ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/local/include/pgsql),)
|
||||
CFLAGS+=-I$(CROSS_COMPILE_TARGET)/usr/local/include/pgsql
|
||||
MLFLAGS+=-L$(CROSS_COMPILE_TARGET)/usr/local/lib/pgsql
|
||||
endif
|
||||
|
||||
ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/opt/pgsql/include),)
|
||||
CFLAGS+=-I$(CROSS_COMPILE_TARGET)/opt/pgsql/include
|
||||
MLFLAGS+=-L$(CROSS_COMPILE_TARGET) /opt/pgsql/lib
|
||||
endif
|
||||
|
||||
ifneq ($(wilcard $(CROSS_COMPILE_TARGET)/usr/include/postgresql),)
|
||||
CFLAGS+=-I$(CROSS_COMPILE_TARGET)/usr/include/postgresql
|
||||
endif
|
||||
|
||||
ifneq ($(wilcard $(CROSS_COMPILE_TARGET)/usr/lib/libpq.so),)
|
||||
MLFLAGS+=-L$(CROSS_COMPILE_TARGET)/usr/lib
|
||||
endif
|
||||
|
||||
all: depend $(MODS)
|
||||
|
||||
install: all
|
||||
|
@ -113,24 +49,36 @@ clean: clean-depend
|
|||
rm -f *.so *.o
|
||||
|
||||
%.so : %.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB}
|
||||
$(CC) $(SOLINK) -o $@ $<
|
||||
|
||||
cdr_odbc.so: cdr_odbc.o
|
||||
$(CC) $(SOLINK) -o $@ $< $(ODBC_LIB)
|
||||
|
||||
cdr_odbc.o: cdr_odbc.c
|
||||
$(CC) -c -o $@ $(CFLAGS) $(ODBC_INCLUDE) $<
|
||||
|
||||
cdr_tds.so: cdr_tds.o
|
||||
$(CC) $(SOLINK) -o $@ $< $(TDS_LIB)
|
||||
|
||||
cdr_tds.o: cdr_tds.c
|
||||
$(CC) -c -o $@ $(CFLAGS) $(TDS_INCLUDE) $<
|
||||
|
||||
cdr_pgsql.so: cdr_pgsql.o
|
||||
$(CC) $(SOLINK) -o $@ $< $(PGSQL_LIB)
|
||||
|
||||
cdr_pgsql.o: cdr_pgsql.c
|
||||
$(CC) -c -o $@ $(CFLAGS) $(PGSQL_INCLUDE) $<
|
||||
|
||||
cdr_sqlite.so: cdr_sqlite.o
|
||||
$(CC) $(SOLINK) -o $@ $< $(SQLITE_LIB)
|
||||
|
||||
cdr_sqlite.o: cdr_sqlite.c
|
||||
$(CC) -c -o $@ $(CFLAGS) $(SQLITE_INCLUDE) $<
|
||||
|
||||
ifneq ($(wildcard .depend),)
|
||||
include .depend
|
||||
endif
|
||||
|
||||
cdr_odbc.so: cdr_odbc.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} -lodbc $(MLFLAGS)
|
||||
|
||||
cdr_tds.so: cdr_tds.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} -ltds $(MLFLAGS)
|
||||
|
||||
cdr_pgsql.so: cdr_pgsql.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} -lpq -lz $(MLFLAGS)
|
||||
|
||||
cdr_sqlite.so: cdr_sqlite.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} -lsqlite $(MLFLAGS)
|
||||
|
||||
depend: .depend
|
||||
|
||||
.depend:
|
||||
|
|
|
@ -28,6 +28,10 @@
|
|||
* \ingroup cdr_drivers
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>unixodbc</depend>
|
||||
***/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
|
|
@ -32,6 +32,10 @@
|
|||
* \ingroup cdr_drivers
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>pgsql</depend>
|
||||
***/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
|
|
@ -31,6 +31,10 @@
|
|||
* \ingroup cdr_drivers
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>sqlite</depend>
|
||||
***/
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <unistd.h>
|
||||
|
|
|
@ -55,6 +55,10 @@ CREATE TABLE [dbo].[cdr] (
|
|||
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>freetds</depend>
|
||||
***/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
|
14
channel.c
14
channel.c
|
@ -32,7 +32,9 @@
|
|||
#include <unistd.h>
|
||||
#include <math.h> /* For PI */
|
||||
|
||||
#ifdef ZAPTEL_OPTIMIZATIONS
|
||||
#include "asterisk.h"
|
||||
|
||||
#ifdef HAVE_ZAPTEL
|
||||
#include <sys/ioctl.h>
|
||||
#ifdef __linux__
|
||||
#include <linux/zaptel.h>
|
||||
|
@ -44,8 +46,6 @@
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
#include "asterisk/pbx.h"
|
||||
|
@ -605,7 +605,7 @@ struct ast_channel *ast_channel_alloc(int needqueue)
|
|||
for (x=0; x<AST_MAX_FDS - 2; x++)
|
||||
tmp->fds[x] = -1;
|
||||
|
||||
#ifdef ZAPTEL_OPTIMIZATIONS
|
||||
#ifdef HAVE_ZAPTEL
|
||||
tmp->timingfd = open("/dev/zap/timer", O_RDWR);
|
||||
if (tmp->timingfd > -1) {
|
||||
/* Check if timing interface supports new
|
||||
|
@ -714,7 +714,7 @@ int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin)
|
|||
if (write(chan->alertpipe[1], &blah, sizeof(blah)) != sizeof(blah))
|
||||
ast_log(LOG_WARNING, "Unable to write to alert pipe on %s, frametype/subclass %d/%d (qlen = %d): %s!\n",
|
||||
chan->name, f->frametype, f->subclass, qlen, strerror(errno));
|
||||
#ifdef ZAPTEL_OPTIMIZATIONS
|
||||
#ifdef HAVE_ZAPTEL
|
||||
} else if (chan->timingfd > -1) {
|
||||
ioctl(chan->timingfd, ZT_TIMERPING, &blah);
|
||||
#endif
|
||||
|
@ -1739,7 +1739,7 @@ int ast_waitfordigit(struct ast_channel *c, int ms)
|
|||
int ast_settimeout(struct ast_channel *c, int samples, int (*func)(void *data), void *data)
|
||||
{
|
||||
int res = -1;
|
||||
#ifdef ZAPTEL_OPTIMIZATIONS
|
||||
#ifdef HAVE_ZAPTEL
|
||||
if (c->timingfd > -1) {
|
||||
if (!func) {
|
||||
samples = 0;
|
||||
|
@ -1852,7 +1852,7 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
|
|||
if (chan->alertpipe[0] > -1)
|
||||
read(chan->alertpipe[0], &blah, sizeof(blah));
|
||||
|
||||
#ifdef ZAPTEL_OPTIMIZATIONS
|
||||
#ifdef HAVE_ZAPTEL
|
||||
if (chan->timingfd > -1 && chan->fdno == AST_TIMING_FD && ast_test_flag(chan, AST_FLAG_EXCEPTION)) {
|
||||
int res;
|
||||
|
||||
|
|
|
@ -7,67 +7,45 @@
|
|||
#
|
||||
# Mark Spencer <markster@digium.com>
|
||||
#
|
||||
# Edited By Belgarath <> Aug 28 2004
|
||||
# Added bare bones ultrasparc-linux support.
|
||||
#
|
||||
# This program is free software, distributed under the terms of
|
||||
# the GNU General Public License
|
||||
#
|
||||
|
||||
MODS:=$(patsubst %.c,%.so,$(wildcard chan_*.c))
|
||||
MODS:=$(filter-out $(MENUSELECT_CHANNELS),$(patsubst %.c,%.so,$(wildcard chan_*.c)))
|
||||
|
||||
ifeq (${OSARCH},OpenBSD)
|
||||
ifeq ($(OSARCH),OpenBSD)
|
||||
PTLIB=-lpt_OpenBSD_x86_r
|
||||
H323LIB=-lh323_OpenBSD_x86_r
|
||||
endif
|
||||
|
||||
ifeq (${OSARCH},Linux)
|
||||
ifeq ($(OSARCH),Linux)
|
||||
PTLIB=-lpt_linux_x86_r
|
||||
H323LIB=-lh323_linux_x86_r
|
||||
CHANH323LIB=-ldl
|
||||
endif
|
||||
|
||||
ifeq (${OSARCH},CYGWIN)
|
||||
CYGSOLINK=-Wl,--out-implib=lib$@.a -Wl,--export-all-symbols
|
||||
CYGSOLIB=-L.. -L. -L../res -lasterisk.dll -lres_features.so
|
||||
CYG_CHAN_AGENT=-lres_monitor.so
|
||||
endif
|
||||
|
||||
ifeq ($(PROC),sparc64)
|
||||
PROC=ultrasparc
|
||||
CFLAGS += -mtune=$(PROC) -O3 -pipe -fomit-frame-pointer -mcpu=v8
|
||||
endif
|
||||
|
||||
ifeq (${OSARCH},FreeBSD)
|
||||
ifeq ($(OSARCH),FreeBSD)
|
||||
PTLIB=-lpt_FreeBSD_x86_r
|
||||
H323LIB=-lh323_FreeBSD_x86_r
|
||||
CHANH323LIB=-pthread
|
||||
endif
|
||||
|
||||
ifeq (${OSARCH},NetBSD)
|
||||
ifeq ($(OSARCH),NetBSD)
|
||||
PTLIB=-lpt_NetBSD_x86_r
|
||||
H323LIB=-lh323_NetBSD_x86_r
|
||||
endif
|
||||
|
||||
ifeq (${OSARCH},Darwin)
|
||||
MODS:=$(filter-out chan_oss.so,$(MODS))
|
||||
endif
|
||||
|
||||
ifeq (${OSARCH},SunOS)
|
||||
MODS:=$(filter-out chan_oss.so,$(MODS))
|
||||
ifeq ($(OSARCH),SunOS)
|
||||
SOLINK+=-lrt
|
||||
endif
|
||||
|
||||
ifeq (${OSARCH},CYGWIN)
|
||||
MODS:=$(filter-out chan_oss.so,$(MODS))
|
||||
endif
|
||||
|
||||
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/linux/ixjuser.h $(CROSS_COMPILE_TARGET)/usr/local/include/ixjuser.h),)
|
||||
MODS:=$(filter-out chan_phone.so,$(MODS))
|
||||
endif
|
||||
|
||||
ifeq (${WITH_SMDI},1)
|
||||
CFLAGS+=-DWITH_SMDI
|
||||
ifeq ($(WITH_SMDI),1)
|
||||
CFLAGS+=-DWITH_SMDI
|
||||
endif
|
||||
|
||||
ifeq ($(wildcard h323/libchanh323.a),)
|
||||
|
@ -80,67 +58,6 @@ else
|
|||
CFLAGS+=-Imisdn
|
||||
endif
|
||||
|
||||
CFLAGS+=-Wno-missing-prototypes -Wno-missing-declarations
|
||||
|
||||
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/alsa/asoundlib.h),)
|
||||
MODS:=$(filter-out chan_alsa.so,$(MODS))
|
||||
endif
|
||||
|
||||
ifndef WITHOUT_PRI
|
||||
ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/lib/libpri.so.1 $(CROSS_COMPILE_TARGET)/usr/local/lib/libpri.so.1),)
|
||||
CFLAGS+=-DZAPATA_PRI
|
||||
ZAPPRI=-lpri
|
||||
endif
|
||||
endif # WITHOUT_PRI
|
||||
|
||||
ifneq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/lib/libmfcr2.so.1 $(CROSS_COMPILE_TARGET)/usr/local/lib/libmfcr2.so.1),)
|
||||
CFLAGS+=-DZAPATA_R2
|
||||
ZAPR2=-lmfcr2
|
||||
endif
|
||||
|
||||
ALSA_SRC=chan_alsa.c
|
||||
|
||||
ifneq ($(wildcard alsa-monitor.h),)
|
||||
CFLAGS+=-DALSA_MONITOR
|
||||
ALSA_SRC+=alsa-monitor.h
|
||||
endif
|
||||
|
||||
ifndef WITHOUT_ZAPTEL
|
||||
ZAPAVAIL:=$(wildcard $(CROSS_COMPILE_TARGET)/usr/include/linux/zaptel.h $(CROSS_COMPILE_TARGET)/usr/local/include/zaptel.h)
|
||||
endif
|
||||
|
||||
ifeq (${ZAPAVAIL},)
|
||||
MODS:=$(filter-out chan_zap.so,$(MODS))
|
||||
else
|
||||
ifeq (${OSARCH},NetBSD)
|
||||
SOLINK+=-L$(CROSS_COMPILE_TARGET)/usr/pkg/lib
|
||||
endif
|
||||
ifeq (${OSARCH},FreeBSD)
|
||||
SOLINK+=-L$(CROSS_COMPILE_TARGET)/usr/local/lib
|
||||
endif
|
||||
CFLAGS+=-DIAX_TRUNKING
|
||||
endif
|
||||
|
||||
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/vpbapi.h),)
|
||||
MODS:=$(filter-out chan_vpb.so,$(MODS))
|
||||
else
|
||||
CFLAGS+=-DLINUX
|
||||
endif
|
||||
|
||||
CFLAGS+=-DCRYPTO
|
||||
|
||||
ifneq ($(OSARCH),CYGWIN)
|
||||
CFLAGS+=-fPIC
|
||||
endif
|
||||
|
||||
CFLAGS+=#-DVOFRDUMPER
|
||||
|
||||
ZAPDIR=/usr/lib
|
||||
|
||||
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/nbs.h),)
|
||||
MODS:=$(filter-out chan_nbs.so,$(MODS))
|
||||
endif
|
||||
|
||||
ifndef OPENH323DIR
|
||||
OPENH323DIR=$(HOME)/openh323
|
||||
endif
|
||||
|
@ -159,7 +76,7 @@ clean: clean-depend
|
|||
rm -f busy.h ringtone.h gentone gentone-ulaw
|
||||
|
||||
%.so : %.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} ${LIBS}
|
||||
$(CC) $(SOLINK) -o $@ $<
|
||||
|
||||
ifneq ($(wildcard .depend),)
|
||||
include .depend
|
||||
|
@ -187,39 +104,35 @@ ringtone.h: gentone
|
|||
|
||||
chan_oss.o: chan_oss.c busy.h ringtone.h
|
||||
|
||||
chan_alsa.o: chan_alsa.c busy.h ringtone.h
|
||||
|
||||
ifeq (${OSARCH},OpenBSD)
|
||||
ifeq ($(OSARCH),OpenBSD)
|
||||
chan_oss.so: chan_oss.o
|
||||
$(CC) $(SOLINK) -o $@ chan_oss.o -lossaudio
|
||||
endif
|
||||
ifeq (${OSARCH},NetBSD)
|
||||
ifeq ($(OSARCH),NetBSD)
|
||||
chan_oss.so: chan_oss.o
|
||||
$(CC) $(SOLINK) -o $@ chan_oss.o -lossaudio
|
||||
endif
|
||||
|
||||
chan_iax2.so: chan_iax2.o iax2-parser.o iax2-provision.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} chan_iax2.o iax2-parser.o iax2-provision.o ${CYGSOLIB}
|
||||
|
||||
chan_zap.o: chan_zap.c
|
||||
$(CC) -c $(CFLAGS) -o chan_zap.o chan_zap.c
|
||||
$(CC) $(SOLINK) -o $@ $< iax2-parser.o iax2-provision.o
|
||||
|
||||
chan_zap.so: chan_zap.o
|
||||
$(CC) $(SOLINK) -o $@ $< $(ZAPPRI) $(ZAPR2) -ltonezone
|
||||
$(CC) $(SOLINK) -o $@ $< $(PRI_LIB) $(MFCR2_LIB) $(ZAPTEL_LIB)
|
||||
|
||||
chan_sip.so: chan_sip.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} chan_sip.o ${CYGSOLIB}
|
||||
|
||||
chan_agent.so: chan_agent.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} chan_agent.o ${CYGSOLIB} ${CYG_CHAN_AGENT}
|
||||
|
||||
chan_alsa.o: $(ALSA_SRC)
|
||||
chan_zap.o: chan_zap.c
|
||||
$(CC) -c -o $@ $(CFLAGS) $(ZAPTEL_INCLUDE) $<
|
||||
|
||||
chan_alsa.so: chan_alsa.o
|
||||
$(CC) $(SOLINK) -o $@ $< -lasound -lm -ldl
|
||||
$(CC) $(SOLINK) -o $@ $< $(ASOUND_LIB)
|
||||
|
||||
chan_alsa.o: chan_alsa.c busy.h ringtone.h
|
||||
$(CC) -c -o $@ $(CFLAGS) $(ASOUND_INCLUDE) $<
|
||||
|
||||
chan_nbs.so: chan_nbs.o
|
||||
$(CC) $(SOLINK) -o $@ $< -lnbs
|
||||
$(CC) $(SOLINK) -o $@ $< $(NBS_LIB)
|
||||
|
||||
chan_nbs.o: chan_nbs.c
|
||||
$(CC) -c -o $@ $(CFLAGS) $(NBS_INCLUDE) $<
|
||||
|
||||
chan_vpb.o: chan_vpb.c
|
||||
$(CXX) -c $(CFLAGS:-Werror=) -o $@ chan_vpb.c
|
||||
|
@ -227,7 +140,7 @@ chan_vpb.o: chan_vpb.c
|
|||
chan_vpb.so: chan_vpb.o
|
||||
$(CXX) $(SOLINK) -o $@ $< -lvpb -lpthread -lm -ldl
|
||||
|
||||
ifeq (${OSARCH},Linux)
|
||||
ifeq ($(OSARCH),Linux)
|
||||
chan_h323.so: chan_h323.o h323/libchanh323.a h323/Makefile.ast
|
||||
$(CC) $(SOLINK) $(H323LDFLAGS) -o $@ $< h323/libchanh323.a $(H323LDLIBS) -lstdc++
|
||||
else
|
||||
|
|
|
@ -2390,7 +2390,7 @@ static int agent_devicestate(void *data)
|
|||
return res;
|
||||
}
|
||||
|
||||
struct agent_pvt *find_agent(char *agentid)
|
||||
static struct agent_pvt *find_agent(char *agentid)
|
||||
{
|
||||
struct agent_pvt *cur;
|
||||
|
||||
|
|
|
@ -27,6 +27,9 @@
|
|||
* \ingroup channel_drivers
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>asound</depend>
|
||||
***/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
@ -1042,7 +1045,7 @@ static struct ast_cli_entry myclis[] = {
|
|||
{ { "autoanswer", NULL }, console_autoanswer, "Sets/displays autoanswer", autoanswer_usage, autoanswer_complete }
|
||||
};
|
||||
|
||||
int load_module(void)
|
||||
static int load_module(void *mod)
|
||||
{
|
||||
int res;
|
||||
int x;
|
||||
|
@ -1101,9 +1104,7 @@ int load_module(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int unload_module(void)
|
||||
static int unload_module(void *mod)
|
||||
{
|
||||
int x;
|
||||
|
||||
|
@ -1125,17 +1126,14 @@ int unload_module(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
const char *description(void)
|
||||
static const char *description(void)
|
||||
{
|
||||
return (char *) desc;
|
||||
}
|
||||
|
||||
int usecount(void)
|
||||
{
|
||||
return usecnt;
|
||||
}
|
||||
|
||||
const char *key(void)
|
||||
static const char *key(void)
|
||||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
||||
STD_MOD(MOD_0, NULL, NULL, NULL);
|
||||
|
|
|
@ -33,6 +33,10 @@
|
|||
* \ingroup channel_drivers
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>h323</depend>
|
||||
***/
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <sys/signal.h>
|
||||
#include <sys/param.h>
|
||||
|
@ -2469,3 +2473,4 @@ const char *key()
|
|||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
||||
|
|
|
@ -49,7 +49,10 @@
|
|||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <regex.h>
|
||||
#ifdef IAX_TRUNKING
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
#ifdef HAVE_ZAPTEL
|
||||
#include <sys/ioctl.h>
|
||||
#ifdef __linux__
|
||||
#include <linux/zaptel.h>
|
||||
|
@ -58,8 +61,6 @@
|
|||
#endif /* __linux__ */
|
||||
#endif
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
#include "asterisk/lock.h"
|
||||
|
@ -9006,7 +9007,7 @@ static void prune_peers(void){
|
|||
|
||||
static void set_timing(void)
|
||||
{
|
||||
#ifdef IAX_TRUNKING
|
||||
#ifdef HAVE_ZAPTEL
|
||||
int bs = trunkfreq * 8;
|
||||
if (timingfd > -1) {
|
||||
if (
|
||||
|
@ -10059,7 +10060,7 @@ static int load_module(void *mod)
|
|||
jb_setoutput(jb_error_output, jb_warning_output, NULL);
|
||||
#endif
|
||||
|
||||
#ifdef IAX_TRUNKING
|
||||
#ifdef HAVE_ZAPTEL
|
||||
#ifdef ZT_TIMERACK
|
||||
timingfd = open("/dev/zap/timer", O_RDWR);
|
||||
if (timingfd < 0)
|
||||
|
|
|
@ -257,16 +257,12 @@ static const char misdn_type[] = "mISDN";
|
|||
|
||||
static int tracing = 0 ;
|
||||
|
||||
static int usecnt=0;
|
||||
|
||||
static char **misdn_key_vector=NULL;
|
||||
static int misdn_key_vector_size=0;
|
||||
|
||||
/* Only alaw and mulaw is allowed for now */
|
||||
static int prefformat = AST_FORMAT_ALAW ; /* AST_FORMAT_SLINEAR ; AST_FORMAT_ULAW | */
|
||||
|
||||
static ast_mutex_t usecnt_lock;
|
||||
|
||||
static int *misdn_debug;
|
||||
static int *misdn_debug_only;
|
||||
static int max_ports;
|
||||
|
@ -620,7 +616,7 @@ static char *misdn_get_ch_state(struct chan_list *p)
|
|||
|
||||
|
||||
|
||||
void reload_config(void)
|
||||
static void reload_config(void)
|
||||
{
|
||||
int i, cfg_debug;
|
||||
chan_misdn_log(-1, 0, "Dynamic Crypting Activation is not support during reload at the moment\n");
|
||||
|
@ -1190,7 +1186,7 @@ static int update_config (struct chan_list *ch, int orig)
|
|||
|
||||
|
||||
|
||||
void config_jitterbuffer(struct chan_list *ch)
|
||||
static void config_jitterbuffer(struct chan_list *ch)
|
||||
{
|
||||
struct misdn_bchannel *bc=ch->bc;
|
||||
int len=ch->jb_len, threshold=ch->jb_upper_threshold;
|
||||
|
@ -2188,7 +2184,7 @@ static int misdn_write(struct ast_channel *ast, struct ast_frame *frame)
|
|||
|
||||
|
||||
|
||||
enum ast_bridge_result misdn_bridge (struct ast_channel *c0,
|
||||
static enum ast_bridge_result misdn_bridge (struct ast_channel *c0,
|
||||
struct ast_channel *c1, int flags,
|
||||
struct ast_frame **fo,
|
||||
struct ast_channel **rc,
|
||||
|
@ -2517,7 +2513,7 @@ static struct ast_channel *misdn_request(const char *type, int format, void *dat
|
|||
}
|
||||
|
||||
|
||||
int misdn_send_text (struct ast_channel *chan, const char *text)
|
||||
static int misdn_send_text (struct ast_channel *chan, const char *text)
|
||||
{
|
||||
struct chan_list *tmp=chan->tech_pvt;
|
||||
|
||||
|
@ -3827,7 +3823,7 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
|
|||
|
||||
static int g_config_initialized=0;
|
||||
|
||||
int unload_module(void)
|
||||
static int unload_module(void *mod)
|
||||
{
|
||||
/* First, take us out of the channel loop */
|
||||
ast_log(LOG_VERBOSE, "-- Unregistering mISDN Channel Driver --\n");
|
||||
|
@ -3872,7 +3868,7 @@ int unload_module(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int load_module(void)
|
||||
static int load_module(void *mod)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -3927,7 +3923,7 @@ int load_module(void)
|
|||
{
|
||||
if (ast_channel_register(&misdn_tech)) {
|
||||
ast_log(LOG_ERROR, "Unable to register channel class %s\n", misdn_type);
|
||||
unload_module();
|
||||
unload_module(mod);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
@ -3979,28 +3975,19 @@ int load_module(void)
|
|||
|
||||
|
||||
|
||||
int reload(void)
|
||||
static int reload(void *mod)
|
||||
{
|
||||
reload_config();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int usecount(void)
|
||||
{
|
||||
int res;
|
||||
ast_mutex_lock(&usecnt_lock);
|
||||
res = usecnt;
|
||||
ast_mutex_unlock(&usecnt_lock);
|
||||
return res;
|
||||
}
|
||||
|
||||
const char *description(void)
|
||||
static const char *description(void)
|
||||
{
|
||||
return desc;
|
||||
}
|
||||
|
||||
const char *key(void)
|
||||
static const char *key(void)
|
||||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
@ -4480,4 +4467,4 @@ void chan_misdn_log(int level, int port, char *tmpl, ...)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
STD_MOD(MOD_0, reload, NULL, NULL);
|
||||
|
|
|
@ -25,6 +25,10 @@
|
|||
* \ingroup channel_drivers
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>nbs</depend>
|
||||
***/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
|
@ -322,3 +326,4 @@ const char *key(void)
|
|||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,10 @@
|
|||
* \ingroup channel_drivers
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>osssound</depend>
|
||||
***/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h> /* for isalnum */
|
||||
#include <math.h> /* exp and log */
|
||||
|
@ -1532,3 +1536,5 @@ static const char *key(void)
|
|||
}
|
||||
|
||||
STD_MOD(MOD_1, NULL, NULL, NULL);
|
||||
|
||||
|
||||
|
|
|
@ -25,6 +25,10 @@
|
|||
* \ingroup channel_drivers
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>ixjuser</depend>
|
||||
***/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
@ -1426,3 +1430,5 @@ static const char *key(void)
|
|||
}
|
||||
|
||||
STD_MOD1;
|
||||
|
||||
|
||||
|
|
|
@ -1164,7 +1164,7 @@ static char *referstatus2str(enum referstatus rstatus)
|
|||
/*! \brief Initialize the initital request packet in the pvt structure.
|
||||
This packet is used for creating replies and future requests in
|
||||
a dialog */
|
||||
void initialize_initreq(struct sip_pvt *p, struct sip_request *req)
|
||||
static void initialize_initreq(struct sip_pvt *p, struct sip_request *req)
|
||||
{
|
||||
if (p->initreq.headers) {
|
||||
ast_log(LOG_WARNING, "Initializing already initialized SIP dialog??? %s\n", p->callid);
|
||||
|
@ -5832,7 +5832,8 @@ static int transmit_message_with_text(struct sip_pvt *p, const char *text)
|
|||
}
|
||||
|
||||
/*! \brief Allocate SIP refer structure */
|
||||
int sip_refer_allocate(struct sip_pvt *p) {
|
||||
static int sip_refer_allocate(struct sip_pvt *p)
|
||||
{
|
||||
p->refer = ast_calloc(1, sizeof(struct sip_refer));
|
||||
return p->refer ? 1 : 0;
|
||||
}
|
||||
|
@ -9550,7 +9551,7 @@ static char show_settings_usage[] =
|
|||
|
||||
|
||||
/*! \brief func_header_read: Read SIP header (dialplan function) */
|
||||
int func_header_read(struct ast_channel *chan, char *function, char *data, char *buf, size_t len)
|
||||
static int func_header_read(struct ast_channel *chan, char *function, char *data, char *buf, size_t len)
|
||||
{
|
||||
struct sip_pvt *p;
|
||||
const char *content;
|
||||
|
@ -9596,7 +9597,7 @@ static struct ast_custom_function sip_header_function = {
|
|||
};
|
||||
|
||||
/*! \brief Dial plan function to check if domain is local */
|
||||
int func_check_sipdomain(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
|
||||
static int func_check_sipdomain(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
|
||||
{
|
||||
if (ast_strlen_zero(data)) {
|
||||
ast_log(LOG_WARNING, "CHECKSIPDOMAIN requires an argument - A domain name\n");
|
||||
|
@ -9714,7 +9715,7 @@ struct ast_custom_function sippeer_function = {
|
|||
};
|
||||
|
||||
/*! \brief ${SIPCHANINFO()} Dialplan function - reads sip channel data */
|
||||
int function_sipchaninfo_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
|
||||
static int function_sipchaninfo_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
|
||||
{
|
||||
struct sip_pvt *p;
|
||||
char iabuf[INET_ADDRSTRLEN];
|
||||
|
|
|
@ -29,6 +29,9 @@
|
|||
* \ingroup channel_drivers
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>vpbapi</depend>
|
||||
***/
|
||||
|
||||
extern "C" {
|
||||
|
||||
|
@ -3055,3 +3058,5 @@ const char *key()
|
|||
}
|
||||
#endif
|
||||
/**/
|
||||
|
||||
|
||||
|
|
|
@ -34,9 +34,13 @@
|
|||
*
|
||||
* \ingroup channel_drivers
|
||||
*
|
||||
* \todo Decprecate the "musiconhold" configuration option in v1.5dev
|
||||
* \todo Decprecate the "musiconhold" configuration option post 1.4
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>zaptel</depend>
|
||||
***/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#ifdef __NetBSD__
|
||||
|
@ -60,18 +64,19 @@
|
|||
#include <math.h>
|
||||
#include <tonezone.h>
|
||||
#include <ctype.h>
|
||||
#ifdef ZAPATA_PRI
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
#ifdef HAVE_LIBPRI
|
||||
#include <libpri.h>
|
||||
#ifndef PRI_KEYPAD_FACILITY_TX
|
||||
#error "You need newer libpri"
|
||||
#endif
|
||||
#endif
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
#include <libmfcr2.h>
|
||||
#endif
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
||||
#include "asterisk/lock.h"
|
||||
|
@ -107,7 +112,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
|||
#define SMDI_MD_WAIT_TIMEOUT 1500 /* 1.5 seconds */
|
||||
#endif
|
||||
|
||||
#if !defined(ZT_SIG_EM_E1) || (defined(ZAPATA_PRI) && !defined(ZT_SIG_HARDHDLC))
|
||||
#if !defined(ZT_SIG_EM_E1) || (defined(HAVE_LIBPRI) && !defined(ZT_SIG_HARDHDLC))
|
||||
#error "Your zaptel is too old. please update"
|
||||
#endif
|
||||
|
||||
|
@ -148,12 +153,11 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
|||
/*! \brief Signaling types that need to use MF detection should be placed in this macro */
|
||||
#define NEED_MFDETECT(p) (((p)->sig == SIG_FEATDMF) || ((p)->sig == SIG_FEATDMF_TA) || ((p)->sig == SIG_E911) || ((p)->sig == SIG_FGC_CAMA) || ((p)->sig == SIG_FGC_CAMAMF) || ((p)->sig == SIG_FEATB))
|
||||
|
||||
|
||||
static const char tdesc[] = "Zapata Telephony Driver"
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
" w/PRI"
|
||||
#endif
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
" w/R2"
|
||||
#endif
|
||||
;
|
||||
|
@ -295,7 +299,7 @@ static int cur_priexclusive = 0;
|
|||
|
||||
static int priindication_oob = 0;
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
static int minunused = 2;
|
||||
static int minidle = 0;
|
||||
static char idleext[AST_MAX_EXTENSION];
|
||||
|
@ -334,7 +338,7 @@ AST_MUTEX_DEFINE_STATIC(iflock);
|
|||
|
||||
static int ifcount = 0;
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
AST_MUTEX_DEFINE_STATIC(pridebugfdlock);
|
||||
#endif
|
||||
|
||||
|
@ -397,13 +401,13 @@ static inline int zt_wait_event(int fd)
|
|||
struct zt_pvt;
|
||||
|
||||
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
static int r2prot = -1;
|
||||
#endif
|
||||
|
||||
static int ringt_base = DEFAULT_RINGT;
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
|
||||
#define PVT_TO_CHANNEL(p) (((p)->prioffset) | ((p)->logicalspan << 8) | (p->pri->mastertrunkgroup ? 0x10000 : 0))
|
||||
#define PRI_CHANNEL(p) ((p) & 0xff)
|
||||
|
@ -595,7 +599,7 @@ static struct zt_pvt {
|
|||
unsigned int usedistinctiveringdetection:1;
|
||||
unsigned int zaptrcallerid:1; /*!< should we use the callerid from incoming call on zap transfer or not */
|
||||
unsigned int transfertobusy:1; /*!< allow flash-transfers to busy channels */
|
||||
#if defined(ZAPATA_PRI)
|
||||
#if defined(HAVE_LIBPRI)
|
||||
unsigned int alerting:1;
|
||||
unsigned int alreadyhungup:1;
|
||||
unsigned int isidlecall:1;
|
||||
|
@ -604,7 +608,7 @@ static struct zt_pvt {
|
|||
unsigned int resetting:1;
|
||||
unsigned int setup_ack:1;
|
||||
#endif
|
||||
#if defined(ZAPATA_R2)
|
||||
#if defined(HAVE_MFCR2)
|
||||
unsigned int hasr2call:1;
|
||||
unsigned int r2blocked:1;
|
||||
unsigned int sigchecked:1;
|
||||
|
@ -686,7 +690,7 @@ static struct zt_pvt {
|
|||
int polarityonanswerdelay;
|
||||
struct timeval polaritydelaytv;
|
||||
int sendcalleridafter;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
struct zt_pri *pri;
|
||||
struct zt_pvt *bearer;
|
||||
struct zt_pvt *realcall;
|
||||
|
@ -694,7 +698,7 @@ static struct zt_pvt {
|
|||
int prioffset;
|
||||
int logicalspan;
|
||||
#endif
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
int r2prot;
|
||||
mfcr2_t *r2;
|
||||
#endif
|
||||
|
@ -735,7 +739,7 @@ static const struct ast_channel_tech zap_tech = {
|
|||
.setoption = zt_setoption,
|
||||
};
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
#define GET_CHANNEL(p) ((p)->bearer ? (p)->bearer->channel : p->channel)
|
||||
#else
|
||||
#define GET_CHANNEL(p) ((p)->channel)
|
||||
|
@ -743,7 +747,7 @@ static const struct ast_channel_tech zap_tech = {
|
|||
|
||||
struct zt_pvt *round_robin[32];
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
static inline int pri_grab(struct zt_pvt *pvt, struct zt_pri *pri)
|
||||
{
|
||||
int res;
|
||||
|
@ -810,13 +814,13 @@ static int zt_get_index(struct ast_channel *ast, struct zt_pvt *p, int nullok)
|
|||
return res;
|
||||
}
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
static void wakeup_sub(struct zt_pvt *p, int a, struct zt_pri *pri)
|
||||
#else
|
||||
static void wakeup_sub(struct zt_pvt *p, int a, void *pri)
|
||||
#endif
|
||||
{
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (pri)
|
||||
ast_mutex_unlock(&pri->lock);
|
||||
#endif
|
||||
|
@ -834,20 +838,20 @@ static void wakeup_sub(struct zt_pvt *p, int a, void *pri)
|
|||
} else
|
||||
break;
|
||||
}
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (pri)
|
||||
ast_mutex_lock(&pri->lock);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
static void zap_queue_frame(struct zt_pvt *p, struct ast_frame *f, struct zt_pri *pri)
|
||||
#else
|
||||
static void zap_queue_frame(struct zt_pvt *p, struct ast_frame *f, void *pri)
|
||||
#endif
|
||||
{
|
||||
/* We must unlock the PRI to avoid the possibility of a deadlock */
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (pri)
|
||||
ast_mutex_unlock(&pri->lock);
|
||||
#endif
|
||||
|
@ -865,7 +869,7 @@ static void zap_queue_frame(struct zt_pvt *p, struct ast_frame *f, void *pri)
|
|||
} else
|
||||
break;
|
||||
}
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (pri)
|
||||
ast_mutex_lock(&pri->lock);
|
||||
#endif
|
||||
|
@ -948,7 +952,7 @@ static void zt_close(int fd)
|
|||
close(fd);
|
||||
}
|
||||
|
||||
int zt_setlinear(int zfd, int linear)
|
||||
static int zt_setlinear(int zfd, int linear)
|
||||
{
|
||||
int res;
|
||||
res = ioctl(zfd, ZT_SETLINEAR, &linear);
|
||||
|
@ -958,7 +962,7 @@ int zt_setlinear(int zfd, int linear)
|
|||
}
|
||||
|
||||
|
||||
int zt_setlaw(int zfd, int law)
|
||||
static int zt_setlaw(int zfd, int law)
|
||||
{
|
||||
int res;
|
||||
res = ioctl(zfd, ZT_SETLAW, &law);
|
||||
|
@ -1032,7 +1036,7 @@ static int zt_digit(struct ast_channel *ast, char digit)
|
|||
ast_mutex_lock(&p->lock);
|
||||
index = zt_get_index(ast, p, 0);
|
||||
if ((index == SUB_REAL) && p->owner) {
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if ((p->sig == SIG_PRI) && (ast->_state == AST_STATE_DIALING) && !p->proceeding) {
|
||||
if (p->setup_ack) {
|
||||
if (!pri_grab(p, p->pri)) {
|
||||
|
@ -1118,7 +1122,7 @@ static char *event2str(int event)
|
|||
return buf;
|
||||
}
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
static char *dialplan2str(int dialplan)
|
||||
{
|
||||
if (dialplan == -1) {
|
||||
|
@ -1128,7 +1132,7 @@ static char *dialplan2str(int dialplan)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
static int str2r2prot(char *swtype)
|
||||
{
|
||||
if (!strcasecmp(swtype, "ar"))
|
||||
|
@ -1524,7 +1528,7 @@ static void fill_rxgain(struct zt_gains *g, float gain, int law)
|
|||
}
|
||||
}
|
||||
|
||||
int set_actual_txgain(int fd, int chan, float gain, int law)
|
||||
static int set_actual_txgain(int fd, int chan, float gain, int law)
|
||||
{
|
||||
struct zt_gains g;
|
||||
int res;
|
||||
|
@ -1542,7 +1546,7 @@ int set_actual_txgain(int fd, int chan, float gain, int law)
|
|||
return ioctl(fd, ZT_SETGAINS, &g);
|
||||
}
|
||||
|
||||
int set_actual_rxgain(int fd, int chan, float gain, int law)
|
||||
static int set_actual_rxgain(int fd, int chan, float gain, int law)
|
||||
{
|
||||
struct zt_gains g;
|
||||
int res;
|
||||
|
@ -1560,7 +1564,7 @@ int set_actual_rxgain(int fd, int chan, float gain, int law)
|
|||
return ioctl(fd, ZT_SETGAINS, &g);
|
||||
}
|
||||
|
||||
int set_actual_gain(int fd, int chan, float rxgain, float txgain, int law)
|
||||
static int set_actual_gain(int fd, int chan, float rxgain, float txgain, int law)
|
||||
{
|
||||
return set_actual_txgain(fd, chan, txgain, law) | set_actual_rxgain(fd, chan, rxgain, law);
|
||||
}
|
||||
|
@ -1667,7 +1671,7 @@ static int restore_conference(struct zt_pvt *p)
|
|||
|
||||
static int send_callerid(struct zt_pvt *p);
|
||||
|
||||
int send_cwcidspill(struct zt_pvt *p)
|
||||
static int send_cwcidspill(struct zt_pvt *p)
|
||||
{
|
||||
p->callwaitcas = 0;
|
||||
p->cidcwexpire = 0;
|
||||
|
@ -1755,7 +1759,7 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
|
|||
struct zt_pvt *p = ast->tech_pvt;
|
||||
int x, res, index,mysig;
|
||||
char *c, *n, *l;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
char *s=NULL;
|
||||
#endif
|
||||
char dest[256]; /* must be same length as p->dialdest */
|
||||
|
@ -1912,7 +1916,7 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
|
|||
ast_mutex_unlock(&p->lock);
|
||||
return -1;
|
||||
}
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
/* Start the trunk, if not GR-303 */
|
||||
if (!p->pri) {
|
||||
#endif
|
||||
|
@ -1925,7 +1929,7 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
|
|||
return -1;
|
||||
}
|
||||
}
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
}
|
||||
#endif
|
||||
ast_log(LOG_DEBUG, "Dialing '%s'\n", c);
|
||||
|
@ -2023,7 +2027,7 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
|
|||
ast_mutex_unlock(&p->lock);
|
||||
return -1;
|
||||
}
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (p->pri) {
|
||||
struct pri_sr *sr;
|
||||
#ifdef SUPPORT_USERUSER
|
||||
|
@ -2241,7 +2245,7 @@ static int destroy_channel(struct zt_pvt *prev, struct zt_pvt *cur, int now)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
static char *zap_send_keypad_facility_app = "ZapSendKeypadFacility";
|
||||
|
||||
static char *zap_send_keypad_facility_synopsis = "Send digits out of band over a PRI";
|
||||
|
@ -2290,7 +2294,7 @@ static int zap_send_keypad_facility_exec(struct ast_channel *chan, void *data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int pri_is_up(struct zt_pri *pri)
|
||||
static int pri_is_up(struct zt_pri *pri)
|
||||
{
|
||||
int x;
|
||||
for (x=0;x<NUM_DCHANS;x++) {
|
||||
|
@ -2300,7 +2304,7 @@ int pri_is_up(struct zt_pri *pri)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int pri_assign_bearer(struct zt_pvt *crv, struct zt_pri *pri, struct zt_pvt *bearer)
|
||||
static int pri_assign_bearer(struct zt_pvt *crv, struct zt_pri *pri, struct zt_pvt *bearer)
|
||||
{
|
||||
bearer->owner = &inuse;
|
||||
bearer->realcall = crv;
|
||||
|
@ -2330,7 +2334,7 @@ static char *pri_order(int level)
|
|||
}
|
||||
|
||||
/* Returns fd of the active dchan */
|
||||
int pri_active_dchan_fd(struct zt_pri *pri)
|
||||
static int pri_active_dchan_fd(struct zt_pri *pri)
|
||||
{
|
||||
int x = -1;
|
||||
|
||||
|
@ -2342,7 +2346,7 @@ int pri_active_dchan_fd(struct zt_pri *pri)
|
|||
return pri->fds[x];
|
||||
}
|
||||
|
||||
int pri_find_dchan(struct zt_pri *pri)
|
||||
static int pri_find_dchan(struct zt_pri *pri)
|
||||
{
|
||||
int oldslot = -1;
|
||||
struct pri *old;
|
||||
|
@ -2523,7 +2527,7 @@ static int zt_hangup(struct ast_channel *ast)
|
|||
p->faxhandled = 0;
|
||||
p->pulsedial = 0;
|
||||
p->onhooktime = time(NULL);
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
p->proceeding = 0;
|
||||
p->progress = 0;
|
||||
p->alerting = 0;
|
||||
|
@ -2539,7 +2543,7 @@ static int zt_hangup(struct ast_channel *ast)
|
|||
if (res < 0)
|
||||
ast_log(LOG_WARNING, "Unable to set law on channel %d to default\n", p->channel);
|
||||
/* Perform low level hangup if no owner left */
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (p->pri) {
|
||||
#ifdef SUPPORT_USERUSER
|
||||
const char *useruser = pbx_builtin_getvar_helper(ast,"USERUSERINFO");
|
||||
|
@ -2592,7 +2596,7 @@ static int zt_hangup(struct ast_channel *ast)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
if (p->sig == SIG_R2) {
|
||||
if (p->hasr2call) {
|
||||
mfcr2_DropCall(p->r2, NULL, UC_NORMAL_CLEARING);
|
||||
|
@ -2658,7 +2662,7 @@ static int zt_hangup(struct ast_channel *ast)
|
|||
x = 0;
|
||||
ast_channel_setoption(ast,AST_OPTION_AUDIO_MODE,&x,sizeof(char),0);
|
||||
}
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (p->bearer) {
|
||||
ast_log(LOG_DEBUG, "Freeing up bearer channel %d\n", p->bearer->channel);
|
||||
/* Free up the bearer channel as well, and
|
||||
|
@ -2769,7 +2773,7 @@ static int zt_answer(struct ast_channel *ast)
|
|||
zt_train_ec(p);
|
||||
}
|
||||
break;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
case SIG_PRI:
|
||||
/* Send a pri acknowledge */
|
||||
if (!pri_grab(p, p->pri)) {
|
||||
|
@ -2782,7 +2786,7 @@ static int zt_answer(struct ast_channel *ast)
|
|||
}
|
||||
break;
|
||||
#endif
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
case SIG_R2:
|
||||
res = mfcr2_AnswerCall(p->r2, NULL);
|
||||
if (res)
|
||||
|
@ -3495,7 +3499,7 @@ static int attempt_transfer(struct zt_pvt *p)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
static struct ast_frame *handle_r2_event(struct zt_pvt *p, mfcr2_event_t *e, int index)
|
||||
{
|
||||
struct ast_frame *f;
|
||||
|
@ -3644,7 +3648,7 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
|
|||
else
|
||||
p->pulsedial = 0;
|
||||
ast_log(LOG_DEBUG, "Detected %sdigit '%c'\n", p->pulsedial ? "pulse ": "", res & 0xff);
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (!p->proceeding && p->sig == SIG_PRI && p->pri && p->pri->overlapdial) {
|
||||
/* absorb event */
|
||||
} else {
|
||||
|
@ -3657,7 +3661,7 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
|
|||
p->subs[index].f.subclass = res & 0xff;
|
||||
dtmf_frame.subclass = res & 0xff;
|
||||
p->subs[index].f.next = ast_frdup(&dtmf_frame);
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
}
|
||||
#endif
|
||||
/* Unmute conference, return the captured digit */
|
||||
|
@ -3687,7 +3691,7 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
|
|||
#endif
|
||||
case ZT_EVENT_BITSCHANGED:
|
||||
if (p->sig == SIG_R2) {
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
struct ast_frame *f = &p->subs[index].f;
|
||||
mfcr2_event_t *e;
|
||||
e = r2_get_event_bits(p);
|
||||
|
@ -3748,7 +3752,7 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
|
|||
}
|
||||
break;
|
||||
case ZT_EVENT_ALARM:
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (p->call) {
|
||||
if (p->pri && p->pri->pri) {
|
||||
if (!pri_grab(p, p->pri)) {
|
||||
|
@ -4099,7 +4103,7 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
|
|||
break;
|
||||
case ZT_EVENT_NOALARM:
|
||||
p->inalarm = 0;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
/* Extremely unlikely but just in case */
|
||||
if (p->bearer)
|
||||
p->bearer->inalarm = 0;
|
||||
|
@ -4773,7 +4777,7 @@ struct ast_frame *zt_read(struct ast_channel *ast)
|
|||
f = NULL;
|
||||
}
|
||||
} else if (f->frametype == AST_FRAME_DTMF) {
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (!p->proceeding && p->sig==SIG_PRI && p->pri && p->pri->overlapdial) {
|
||||
/* Don't accept in-band DTMF when in overlap dial mode */
|
||||
f->frametype = AST_FRAME_NULL;
|
||||
|
@ -4893,7 +4897,7 @@ static int zt_write(struct ast_channel *ast, struct ast_frame *frame)
|
|||
}
|
||||
|
||||
#if 0
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
ast_mutex_lock(&p->lock);
|
||||
if (!p->proceeding && p->sig==SIG_PRI && p->pri && !p->outgoing) {
|
||||
if (p->pri->pri) {
|
||||
|
@ -4980,7 +4984,7 @@ static int zt_indicate(struct ast_channel *chan, int condition)
|
|||
if (index == SUB_REAL) {
|
||||
switch(condition) {
|
||||
case AST_CONTROL_BUSY:
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (p->priindication_oob && p->sig == SIG_PRI) {
|
||||
chan->hangupcause = AST_CAUSE_USER_BUSY;
|
||||
chan->_softhangup |= AST_SOFTHANGUP_DEV;
|
||||
|
@ -5001,7 +5005,7 @@ static int zt_indicate(struct ast_channel *chan, int condition)
|
|||
res = tone_zone_play_tone(p->subs[index].zfd, ZT_TONE_BUSY);
|
||||
break;
|
||||
case AST_CONTROL_RINGING:
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if ((!p->alerting) && p->sig==SIG_PRI && p->pri && !p->outgoing && (chan->_state != AST_STATE_UP)) {
|
||||
if (p->pri->pri) {
|
||||
if (!pri_grab(p, p->pri)) {
|
||||
|
@ -5025,7 +5029,7 @@ static int zt_indicate(struct ast_channel *chan, int condition)
|
|||
break;
|
||||
case AST_CONTROL_PROCEEDING:
|
||||
ast_log(LOG_DEBUG,"Received AST_CONTROL_PROCEEDING on %s\n",chan->name);
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (!p->proceeding && p->sig==SIG_PRI && p->pri && !p->outgoing) {
|
||||
if (p->pri->pri) {
|
||||
if (!pri_grab(p, p->pri)) {
|
||||
|
@ -5043,7 +5047,7 @@ static int zt_indicate(struct ast_channel *chan, int condition)
|
|||
break;
|
||||
case AST_CONTROL_PROGRESS:
|
||||
ast_log(LOG_DEBUG,"Received AST_CONTROL_PROGRESS on %s\n",chan->name);
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
p->digital = 0; /* Digital-only calls isn't allows any inband progress messages */
|
||||
if (!p->progress && p->sig==SIG_PRI && p->pri && !p->outgoing) {
|
||||
if (p->pri->pri) {
|
||||
|
@ -5062,7 +5066,7 @@ static int zt_indicate(struct ast_channel *chan, int condition)
|
|||
break;
|
||||
case AST_CONTROL_CONGESTION:
|
||||
chan->hangupcause = AST_CAUSE_CONGESTION;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (p->priindication_oob && p->sig == SIG_PRI) {
|
||||
chan->hangupcause = AST_CAUSE_SWITCH_CONGESTION;
|
||||
chan->_softhangup |= AST_SOFTHANGUP_DEV;
|
||||
|
@ -5081,7 +5085,7 @@ static int zt_indicate(struct ast_channel *chan, int condition)
|
|||
#endif
|
||||
res = tone_zone_play_tone(p->subs[index].zfd, ZT_TONE_CONGESTION);
|
||||
break;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
case AST_CONTROL_HOLD:
|
||||
if (p->pri) {
|
||||
if (!pri_grab(p, p->pri)) {
|
||||
|
@ -5167,7 +5171,7 @@ static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int
|
|||
}
|
||||
y = 1;
|
||||
do {
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (i->bearer || (i->pri && (i->sig == SIG_FXSKS)))
|
||||
ast_string_field_build(tmp, name, "Zap/%d:%d-%d", i->pri->trunkgroup, i->channel, y);
|
||||
else
|
||||
|
@ -5224,7 +5228,7 @@ static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int
|
|||
i->dsp = NULL;
|
||||
if (i->dsp) {
|
||||
i->dsp_features = features & ~DSP_PROGRESS_TALK;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
/* We cannot do progress detection until receives PROGRESS message */
|
||||
if (i->outgoing && (i->sig == SIG_PRI)) {
|
||||
/* Remember requested DSP features, don't treat
|
||||
|
@ -5282,7 +5286,7 @@ static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int
|
|||
#endif
|
||||
tmp->cid.cid_pres = i->callingpres;
|
||||
tmp->cid.cid_ton = i->cid_ton;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
tmp->transfercapability = transfercapability;
|
||||
pbx_builtin_setvar_helper(tmp, "TRANSFERCAPABILITY", ast_transfercapability2str(transfercapability));
|
||||
if (transfercapability & PRI_TRANS_CAP_DIGITAL) {
|
||||
|
@ -5391,7 +5395,7 @@ static void *ss_thread(void *data)
|
|||
if (p->dsp)
|
||||
ast_dsp_digitreset(p->dsp);
|
||||
switch(p->sig) {
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
case SIG_PRI:
|
||||
/* Now loop looking for an extension */
|
||||
ast_copy_string(exten, p->exten, sizeof(exten));
|
||||
|
@ -5994,7 +5998,7 @@ lax);
|
|||
case SIG_FXSLS:
|
||||
case SIG_FXSGS:
|
||||
case SIG_FXSKS:
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (p->pri) {
|
||||
/* This is a GR-303 trunk actually. Wait for the first ring... */
|
||||
struct ast_frame *f;
|
||||
|
@ -6446,7 +6450,7 @@ lax);
|
|||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
static int handle_init_r2_event(struct zt_pvt *i, mfcr2_event_t *e)
|
||||
{
|
||||
struct ast_channel *chan;
|
||||
|
@ -6503,7 +6507,7 @@ static int handle_init_event(struct zt_pvt *i, int event)
|
|||
case ZT_EVENT_NONE:
|
||||
case ZT_EVENT_BITSCHANGED:
|
||||
if (i->radio) break;
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
if (i->r2) {
|
||||
mfcr2_event_t *e;
|
||||
e = r2_get_event_bits(i);
|
||||
|
@ -6739,7 +6743,7 @@ static void *do_monitor(void *data)
|
|||
pfds[count].events = POLLPRI;
|
||||
pfds[count].revents = 0;
|
||||
/* Message waiting or r2 channels also get watched for reading */
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
if (i->cidspill || i->r2)
|
||||
#else
|
||||
if (i->cidspill)
|
||||
|
@ -6833,14 +6837,14 @@ static void *do_monitor(void *data)
|
|||
pollres = ast_fdisset(pfds, i->subs[SUB_REAL].zfd, count, &spoint);
|
||||
if (pollres & POLLIN) {
|
||||
if (i->owner || i->subs[SUB_REAL].owner) {
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (!i->pri)
|
||||
#endif
|
||||
ast_log(LOG_WARNING, "Whoa.... I'm owned but found (%d) in read...\n", i->subs[SUB_REAL].zfd);
|
||||
i = i->next;
|
||||
continue;
|
||||
}
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
if (i->r2) {
|
||||
/* If it's R2 signalled, we always have to check for events */
|
||||
mfcr2_event_t *e;
|
||||
|
@ -6889,14 +6893,14 @@ static void *do_monitor(void *data)
|
|||
handle_init_event(i, res);
|
||||
ast_mutex_lock(&iflock);
|
||||
}
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
if ((pollres & POLLPRI) || (i->r2 && !i->sigchecked))
|
||||
#else
|
||||
if (pollres & POLLPRI)
|
||||
#endif
|
||||
{
|
||||
if (i->owner || i->subs[SUB_REAL].owner) {
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (!i->pri)
|
||||
#endif
|
||||
ast_log(LOG_WARNING, "Whoa.... I'm owned but found (%d)...\n", i->subs[SUB_REAL].zfd);
|
||||
|
@ -6962,7 +6966,7 @@ static int restart_monitor(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
static int pri_resolve_span(int *span, int channel, int offset, struct zt_spaninfo *si)
|
||||
{
|
||||
int x;
|
||||
|
@ -7096,7 +7100,7 @@ static struct zt_pvt *mkintf(int channel, int signalling, int outsignalling, int
|
|||
wlist = &iflist;
|
||||
wend = &ifend;
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (pri) {
|
||||
wlist = &pri->crvs;
|
||||
wend = &pri->crvend;
|
||||
|
@ -7169,7 +7173,7 @@ static struct zt_pvt *mkintf(int channel, int signalling, int outsignalling, int
|
|||
return NULL;
|
||||
}
|
||||
}
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if ((signalling == SIG_PRI) || (signalling == SIG_GR303FXOKS) || (signalling == SIG_GR303FXSKS)) {
|
||||
int offset;
|
||||
int myswitchtype;
|
||||
|
@ -7289,7 +7293,7 @@ static struct zt_pvt *mkintf(int channel, int signalling, int outsignalling, int
|
|||
tmp->prioffset = 0;
|
||||
}
|
||||
#endif
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
if (signalling == SIG_R2) {
|
||||
if (r2prot < 0) {
|
||||
ast_log(LOG_WARNING, "R2 Country not specified for channel %d -- Assuming China\n", tmp->channel);
|
||||
|
@ -7485,7 +7489,7 @@ static struct zt_pvt *mkintf(int channel, int signalling, int outsignalling, int
|
|||
zt_set_hook(tmp->subs[SUB_REAL].zfd, ZT_ONHOOK);
|
||||
}
|
||||
ioctl(tmp->subs[SUB_REAL].zfd,ZT_SETTONEZONE,&tmp->tonezone);
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
/* the dchannel is down so put the channel in alarm */
|
||||
if (tmp->pri && !pri_is_up(tmp->pri))
|
||||
tmp->inalarm = 1;
|
||||
|
@ -7585,7 +7589,7 @@ static inline int available(struct zt_pvt *p, int channelmatch, int groupmatch,
|
|||
|
||||
/* If no owner definitely available */
|
||||
if (!p->owner) {
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
/* Trust PRI */
|
||||
if (p->pri) {
|
||||
if (p->resetting || p->call)
|
||||
|
@ -7594,7 +7598,7 @@ static inline int available(struct zt_pvt *p, int channelmatch, int groupmatch,
|
|||
return 1;
|
||||
}
|
||||
#endif
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
/* Trust R2 as well */
|
||||
if (p->r2) {
|
||||
if (p->hasr2call || p->r2blocked)
|
||||
|
@ -7702,7 +7706,7 @@ static struct zt_pvt *chandup(struct zt_pvt *src)
|
|||
}
|
||||
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
static int pri_find_empty_chan(struct zt_pri *pri, int backwards)
|
||||
{
|
||||
int x;
|
||||
|
@ -7744,7 +7748,7 @@ static struct ast_channel *zt_request(const char *type, int format, void *data,
|
|||
char opt=0;
|
||||
int res=0, y=0;
|
||||
int backwards = 0;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
int crv;
|
||||
int bearer = -1;
|
||||
int trunkgroup;
|
||||
|
@ -7804,7 +7808,7 @@ static struct ast_channel *zt_request(const char *type, int format, void *data,
|
|||
x = CHAN_PSEUDO;
|
||||
channelmatch = x;
|
||||
}
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
else if ((res = sscanf(s, "%d:%d%c%d", &trunkgroup, &crv, &opt, &y)) > 1) {
|
||||
if ((trunkgroup < 1) || (crv < 1)) {
|
||||
ast_log(LOG_WARNING, "Unable to determine trunk group and CRV for data %s\n", (char *)data);
|
||||
|
@ -7855,7 +7859,7 @@ static struct ast_channel *zt_request(const char *type, int format, void *data,
|
|||
goto next;
|
||||
|
||||
callwait = (p->owner != NULL);
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (pri && (p->subs[SUB_REAL].zfd < 0)) {
|
||||
if (p->sig != SIG_FXSKS) {
|
||||
/* Gotta find an actual channel to use for this
|
||||
|
@ -7892,7 +7896,7 @@ static struct ast_channel *zt_request(const char *type, int format, void *data,
|
|||
}
|
||||
p->outgoing = 1;
|
||||
tmp = zt_new(p, AST_STATE_RESERVED, 0, p->owner ? SUB_CALLWAIT : SUB_REAL, 0, 0);
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (p->bearer) {
|
||||
/* Log owner to bearer channel, too */
|
||||
p->bearer->owner = tmp;
|
||||
|
@ -7954,7 +7958,7 @@ next:
|
|||
}
|
||||
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
static struct zt_pvt *pri_find_crv(struct zt_pri *pri, int crv)
|
||||
{
|
||||
struct zt_pvt *p;
|
||||
|
@ -8252,7 +8256,8 @@ static int pri_hangup_all(struct zt_pvt *p, struct zt_pri *pri)
|
|||
ast_mutex_lock(&pri->lock);
|
||||
return 0;
|
||||
}
|
||||
char * redirectingreason2str(int redirectingreason)
|
||||
|
||||
static char * redirectingreason2str(int redirectingreason)
|
||||
{
|
||||
switch (redirectingreason) {
|
||||
case 0:
|
||||
|
@ -9735,10 +9740,10 @@ static struct ast_cli_entry zap_pri_cli[] = {
|
|||
"Ends PRI debug output to file" },
|
||||
};
|
||||
|
||||
#endif /* ZAPATA_PRI */
|
||||
#endif /* HAVE_LIBPRI */
|
||||
|
||||
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
static int handle_r2_no_debug(int fd, int argc, char *argv[])
|
||||
{
|
||||
int chan;
|
||||
|
@ -9847,7 +9852,7 @@ static int zap_show_channels(int fd, int argc, char **argv)
|
|||
char tmps[20] = "";
|
||||
ast_mutex_t *lock;
|
||||
struct zt_pvt *start;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
int trunkgroup;
|
||||
struct zt_pri *pri=NULL;
|
||||
int x;
|
||||
|
@ -9856,7 +9861,7 @@ static int zap_show_channels(int fd, int argc, char **argv)
|
|||
lock = &iflock;
|
||||
start = iflist;
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (argc == 4) {
|
||||
if ((trunkgroup = atoi(argv[3])) < 1)
|
||||
return RESULT_SHOWUSAGE;
|
||||
|
@ -9879,7 +9884,7 @@ static int zap_show_channels(int fd, int argc, char **argv)
|
|||
return RESULT_SHOWUSAGE;
|
||||
|
||||
ast_mutex_lock(lock);
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
ast_cli(fd, FORMAT2, pri ? "CRV" : "Chan", "Extension", "Context", "Language", "MusicOnHold");
|
||||
#else
|
||||
ast_cli(fd, FORMAT2, "Chan", "Extension", "Context", "Language", "MusicOnHold");
|
||||
|
@ -9909,7 +9914,7 @@ static int zap_show_channel(int fd, int argc, char **argv)
|
|||
int x;
|
||||
ast_mutex_t *lock;
|
||||
struct zt_pvt *start;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
char *c;
|
||||
int trunkgroup;
|
||||
struct zt_pri *pri=NULL;
|
||||
|
@ -9920,7 +9925,7 @@ static int zap_show_channel(int fd, int argc, char **argv)
|
|||
|
||||
if (argc != 4)
|
||||
return RESULT_SHOWUSAGE;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if ((c = strchr(argv[3], ':'))) {
|
||||
if (sscanf(argv[3], "%d:%d", &trunkgroup, &channel) != 2)
|
||||
return RESULT_SHOWUSAGE;
|
||||
|
@ -9947,7 +9952,7 @@ static int zap_show_channel(int fd, int argc, char **argv)
|
|||
tmp = start;
|
||||
while (tmp) {
|
||||
if (tmp->channel == channel) {
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (pri)
|
||||
ast_cli(fd, "Trunk/CRV: %d/%d\n", trunkgroup, tmp->channel);
|
||||
else
|
||||
|
@ -9985,7 +9990,7 @@ static int zap_show_channel(int fd, int argc, char **argv)
|
|||
if (tmp->slaves[x])
|
||||
ast_cli(fd, "Slave Channel: %d\n", tmp->slaves[x]->channel);
|
||||
}
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (tmp->pri) {
|
||||
ast_cli(fd, "PRI Flags: ");
|
||||
if (tmp->resetting)
|
||||
|
@ -10002,7 +10007,7 @@ static int zap_show_channel(int fd, int argc, char **argv)
|
|||
}
|
||||
|
||||
#endif
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
if (tmp->r2) {
|
||||
ast_cli(fd, "R2 Flags: ");
|
||||
if (tmp->r2blocked)
|
||||
|
@ -10342,7 +10347,7 @@ static int __unload_module(void)
|
|||
{
|
||||
int x = 0;
|
||||
struct zt_pvt *p, *pl;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
int i;
|
||||
for(i=0;i<NUM_SPANS;i++) {
|
||||
if (pris[i].master != AST_PTHREADT_NULL)
|
||||
|
@ -10351,7 +10356,7 @@ static int __unload_module(void)
|
|||
ast_cli_unregister_multiple(zap_pri_cli, sizeof(zap_pri_cli) / sizeof(zap_pri_cli[0]));
|
||||
ast_unregister_application(zap_send_keypad_facility_app);
|
||||
#endif
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
ast_cli_unregister_multiple(zap_r2_cli, sizeof(zap_r2_cli) / sizeof(zap_r2_cli[0]));
|
||||
#endif
|
||||
ast_cli_unregister_multiple(zap_cli, sizeof(zap_cli) / sizeof(zap_cli[0]));
|
||||
|
@ -10413,7 +10418,7 @@ static int __unload_module(void)
|
|||
ast_log(LOG_WARNING, "Unable to lock the monitor\n");
|
||||
return -1;
|
||||
}
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
for(i=0;i<NUM_SPANS;i++) {
|
||||
if (pris[i].master && (pris[i].master != AST_PTHREADT_NULL))
|
||||
pthread_join(pris[i].master, NULL);
|
||||
|
@ -10425,7 +10430,7 @@ static int __unload_module(void)
|
|||
|
||||
static int unload_module(void *mod)
|
||||
{
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
int y;
|
||||
for (y=0;y<NUM_SPANS;y++)
|
||||
ast_mutex_destroy(&pris[y].lock);
|
||||
|
@ -10445,7 +10450,7 @@ static int setup_zap(int reload)
|
|||
int y;
|
||||
int found_pseudo = 0;
|
||||
int cur_radio = 0;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
int spanno;
|
||||
int i;
|
||||
int logicalspan;
|
||||
|
@ -10468,7 +10473,7 @@ static int setup_zap(int reload)
|
|||
ast_log(LOG_ERROR, "Unable to lock interface list???\n");
|
||||
return -1;
|
||||
}
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (!reload) {
|
||||
/* Process trunkgroups first */
|
||||
v = ast_variable_browse(cfg, "trunkgroups");
|
||||
|
@ -10532,7 +10537,7 @@ static int setup_zap(int reload)
|
|||
while(v) {
|
||||
/* Create the interface list */
|
||||
if (!strcasecmp(v->name, "channel")
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
|| !strcasecmp(v->name, "crv")
|
||||
#endif
|
||||
) {
|
||||
|
@ -10546,7 +10551,7 @@ static int setup_zap(int reload)
|
|||
}
|
||||
c = v->value;
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
pri = NULL;
|
||||
if (!strcasecmp(v->name, "crv")) {
|
||||
if (sscanf(c, "%d:%n", &trunkgroup, &y) != 1) {
|
||||
|
@ -10600,7 +10605,7 @@ static int setup_zap(int reload)
|
|||
}
|
||||
if (cur_outsignalling < 0) cur_outsignalling = cur_signalling;
|
||||
for (x=start;x<=finish;x++) {
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
tmp = mkintf(x, cur_signalling, cur_outsignalling, cur_radio, pri, reload);
|
||||
#else
|
||||
tmp = mkintf(x, cur_signalling, cur_outsignalling, cur_radio, NULL, reload);
|
||||
|
@ -10608,7 +10613,7 @@ static int setup_zap(int reload)
|
|||
|
||||
if (tmp) {
|
||||
if (option_verbose > 2) {
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (pri)
|
||||
ast_verbose(VERBOSE_PREFIX_3 "%s CRV %d:%d, %s signalling\n", reload ? "Reconfigured" : "Registered", trunkgroup,x, sig2str(tmp->sig));
|
||||
else
|
||||
|
@ -10909,7 +10914,7 @@ static int setup_zap(int reload)
|
|||
} else if (!strcasecmp(v->value, "featb")) {
|
||||
cur_signalling = SIG_FEATB;
|
||||
cur_radio = 0;
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
} else if (!strcasecmp(v->value, "pri_net")) {
|
||||
cur_radio = 0;
|
||||
cur_signalling = SIG_PRI;
|
||||
|
@ -10927,7 +10932,7 @@ static int setup_zap(int reload)
|
|||
cur_radio = 0;
|
||||
pritype = PRI_CPE;
|
||||
#endif
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
} else if (!strcasecmp(v->value, "r2")) {
|
||||
cur_signalling = SIG_R2;
|
||||
cur_radio = 0;
|
||||
|
@ -10971,14 +10976,14 @@ static int setup_zap(int reload)
|
|||
} else {
|
||||
ast_log(LOG_ERROR, "Unknown signalling method '%s'\n", v->value);
|
||||
}
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
} else if (!strcasecmp(v->name, "r2country")) {
|
||||
r2prot = str2r2prot(v->value);
|
||||
if (r2prot < 0) {
|
||||
ast_log(LOG_WARNING, "Unknown R2 Country '%s' at line %d.\n", v->value, v->lineno);
|
||||
}
|
||||
#endif
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
} else if (!strcasecmp(v->name, "pridialplan")) {
|
||||
if (!strcasecmp(v->value, "national")) {
|
||||
dialplan = PRI_NATIONAL_ISDN + 1;
|
||||
|
@ -11105,7 +11110,7 @@ static int setup_zap(int reload)
|
|||
} else if (!strcasecmp(v->name, "facilityenable")) {
|
||||
facilityenable = ast_true(v->value);
|
||||
#endif /* PRI_GETSET_TIMERS */
|
||||
#endif /* ZAPATA_PRI */
|
||||
#endif /* HAVE_LIBPRI */
|
||||
} else if (!strcasecmp(v->name, "cadence")) {
|
||||
/* setup to scan our argument */
|
||||
int element_count, c[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||
|
@ -11263,7 +11268,7 @@ static int setup_zap(int reload)
|
|||
}
|
||||
ast_mutex_unlock(&iflock);
|
||||
ast_config_destroy(cfg);
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
if (!reload) {
|
||||
for (x=0;x<NUM_SPANS;x++) {
|
||||
if (pris[x].pvts[0]) {
|
||||
|
@ -11285,7 +11290,7 @@ static int load_module(void *mod)
|
|||
{
|
||||
int res;
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
int y,i;
|
||||
memset(pris, 0, sizeof(pris));
|
||||
for (y=0;y<NUM_SPANS;y++) {
|
||||
|
@ -11310,12 +11315,12 @@ static int load_module(void *mod)
|
|||
__unload_module();
|
||||
return -1;
|
||||
}
|
||||
#ifdef ZAPATA_PRI
|
||||
#ifdef HAVE_LIBPRI
|
||||
ast_string_field_init(&inuse, 16);
|
||||
ast_string_field_set(&inuse, name, "GR-303InUse");
|
||||
ast_cli_register_multiple(zap_pri_cli, sizeof(zap_pri_cli) / sizeof(zap_pri_cli[0]));
|
||||
#endif
|
||||
#ifdef ZAPATA_R2
|
||||
#ifdef HAVE_MFCR2
|
||||
ast_cli_register_multiple(zap_r2_cli, sizeof(zap_r2_cli) / sizeof(zap_r2_cli[0]));
|
||||
#endif
|
||||
ast_cli_register_multiple(zap_cli, sizeof(zap_cli) / sizeof(zap_cli[0]));
|
||||
|
@ -11458,4 +11463,7 @@ static const char *key(void)
|
|||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
||||
STD_MOD(MOD_1, reload, NULL, NULL);
|
||||
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# Verify those options with main Makefile
|
||||
STDCCFLAGS += -DNDEBUG
|
||||
STDCCFLAGS += $(shell grep ^DEBUG_THREADS ../../Makefile | sed -e "s/^DEBUG_THREADS[ ]*=//" -e "s/\([^\#]*\)\#.*/\1/")
|
||||
STDCCFLAGS += -I../../include
|
||||
STDCCFLAGS += -I../../include -include autoconfig.h
|
||||
STDCCFLAGS += -Wmissing-prototypes
|
||||
STDCCFLAGS += -fPIC
|
||||
#OPTCCFLAGS +=
|
||||
|
|
|
@ -11,14 +11,7 @@
|
|||
# the GNU General Public License
|
||||
#
|
||||
|
||||
MODS:=$(patsubst %.c,%.so,$(wildcard codec_*.c))
|
||||
|
||||
ifeq (${OSARCH},CYGWIN)
|
||||
CYGSOLINK=-Wl,--out-implib=lib$@.a -Wl,--export-all-symbols
|
||||
CYGSOLIB=-L.. -L. -lasterisk.dll
|
||||
else
|
||||
CFLAGS+=-fPIC
|
||||
endif
|
||||
MODS:=$(filter-out $(MENUSELECT_CODECS),$(patsubst %.c,%.so,$(wildcard codec_*.c)))
|
||||
|
||||
ifeq ($(wildcard g723.1/coder.c),)
|
||||
MODS:=$(filter-out codec_g723_1.so,$(MODS))
|
||||
|
@ -31,33 +24,12 @@ ifneq ($(wildcard g723.1b/coder2.c),)
|
|||
LIBG723B=g723.1b/libg723b.a
|
||||
endif
|
||||
|
||||
SPEEX_PATH:=/usr/local/include /usr/include /usr/include/speex /usr/local/include/speex
|
||||
SPEEX_SYSTEM_HEADERS:=$(firstword $(wildcard $(SPEEX_PATH:%=$(CROSS_COMPILE_TARGET)%/speex.h)))
|
||||
ifeq (${SPEEX_SYSTEM_HEADERS},)
|
||||
MODS:=$(filter-out codec_speex.so,$(MODS))
|
||||
else
|
||||
CFLAGS+=-I$(subst /speex.h,,${SPEEX_SYSTEM_HEADERS})
|
||||
LIBSPEEX=-lspeex -lm
|
||||
endif
|
||||
|
||||
ifeq ($(wildcard ilbc/iLBC_decode.h),)
|
||||
MODS:=$(filter-out codec_ilbc.so,$(MODS))
|
||||
else
|
||||
LIBILBC=ilbc/libilbc.a
|
||||
endif
|
||||
|
||||
LIBGSM_PATH:=/usr/local/include /usr/include
|
||||
LIBGSM_SYSTEM_HEADERS:=$(firstword $(wildcard $(LIBGSM_PATH:%=$(CROSS_COMPILE_TARGET)%/gsm/gsm.h)))
|
||||
ifneq ($(LIBGSM_SYSTEM_HEADERS),)
|
||||
LIBGSM=-lgsm
|
||||
LIBGSMT=
|
||||
CFLAGS+=-DUSE_EXTERNAL_GSM_LIB
|
||||
else
|
||||
LIBGSM=gsm/lib/libgsm.a
|
||||
LIBGSMT=$(LIBGSM)
|
||||
CFLAGS+=-I.
|
||||
endif
|
||||
|
||||
LIBLPC10=lpc10/liblpc10.a
|
||||
|
||||
all: depend $(MODS)
|
||||
|
@ -74,43 +46,57 @@ clean: clean-depend
|
|||
$(MAKE) -C ilbc clean
|
||||
|
||||
$(LIBG723):
|
||||
$(MAKE) -C g723.1 all
|
||||
CFLAGS="$(ASTCFLAGS)" $(MAKE) -C g723.1 all
|
||||
|
||||
$(LIBGSM):
|
||||
$(MAKE) -C gsm lib/libgsm.a
|
||||
gsm/lib/libgsm.a:
|
||||
CFLAGS="$(ASTCFLAGS) -I." $(MAKE) -C gsm lib/libgsm.a
|
||||
|
||||
$(LIBG723B):
|
||||
$(MAKE) -C g723.1b all
|
||||
CFLAGS="$(ASTCFLAGS)" $(MAKE) -C g723.1b all
|
||||
|
||||
$(LIBLPC10):
|
||||
$(MAKE) -C lpc10 all
|
||||
CFLAGS="$(ASTCFLAGS)" $(MAKE) -C lpc10 all
|
||||
|
||||
$(LIBILBC):
|
||||
$(MAKE) -C ilbc all
|
||||
CFLAGS="$(ASTCFLAGS)" $(MAKE) -C ilbc all
|
||||
|
||||
codec_ilbc.so: codec_ilbc.o $(LIBILBC)
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} $(LIBILBC)
|
||||
$(CC) $(SOLINK) -o $@ $< $(LIBILBC)
|
||||
|
||||
codec_g723_1.so : codec_g723_1.o $(LIBG723)
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} $(LIBG723)
|
||||
$(CC) $(SOLINK) -o $@ $< $(LIBG723)
|
||||
|
||||
codec_g723_1b.o : codec_g723_1.c
|
||||
$(CC) -c -o $@ $(CFLAGS) -DANNEX_B -Dsingle $<
|
||||
|
||||
codec_g723_1b.so : codec_g723_1b.o $(LIBG723B)
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} $(LIBG723B) -lm
|
||||
$(CC) $(SOLINK) -o $@ $< $(LIBG723B) -lm
|
||||
|
||||
codec_gsm.so: codec_gsm.o $(LIBGSMT)
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} $(LIBGSM)
|
||||
ifeq ($(GSM_LIB),internal)
|
||||
codec_gsm.o: codec_gsm.c
|
||||
$(CC) -c -o $@ $(CFLAGS) -Igsm/inc $<
|
||||
|
||||
codec_gsm.so: codec_gsm.o gsm/lib/libgsm.a
|
||||
$(CC) $(SOLINK) -o $@ $< gsm/lib/libgsm.a
|
||||
else
|
||||
codec_gsm.o: codec_gsm.c
|
||||
$(CC) -c -o $@ $(CFLAGS) $(GSM_INCLUDE) $<
|
||||
|
||||
codec_gsm.so: codec_gsm.o
|
||||
$(CC) $(SOLINK) -o $@ $< $(GSM_LIB)
|
||||
endif
|
||||
|
||||
codec_speex.o: codec_speex.c
|
||||
$(CC) -c -o $@ $(CFLAGS) $(SPEEX_INCLUDE) $<
|
||||
|
||||
codec_speex.so: codec_speex.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} $(LIBSPEEX)
|
||||
$(CC) $(SOLINK) -o $@ $< $(SPEEX_LIB)
|
||||
|
||||
codec_lpc10.so: codec_lpc10.o $(LIBLPC10)
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} $(LIBLPC10) -lm
|
||||
$(CC) $(SOLINK) -o $@ $< $(LIBLPC10) -lm
|
||||
|
||||
%.so : %.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB}
|
||||
$(CC) $(SOLINK) -o $@ $<
|
||||
|
||||
ifneq ($(wildcard .depend),)
|
||||
include .depend
|
||||
|
|
|
@ -26,6 +26,10 @@
|
|||
* \ingroup codecs
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>libgsm</depend>
|
||||
***/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
@ -46,11 +50,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
|||
#include "asterisk/channel.h"
|
||||
#include "asterisk/utils.h"
|
||||
|
||||
#ifdef USE_EXTERNAL_GSM_LIB
|
||||
#include <gsm/gsm.h>
|
||||
#else
|
||||
#include "gsm/inc/gsm.h"
|
||||
#endif
|
||||
#include "gsm.h"
|
||||
|
||||
#include "../formats/msgsm.h"
|
||||
|
||||
|
|
|
@ -27,13 +27,17 @@
|
|||
* \ingroup codecs
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>libspeex</depend>
|
||||
***/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <netinet/in.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <speex.h>
|
||||
#include <speex/speex.h>
|
||||
|
||||
/* We require a post 1.1.8 version of Speex to enable preprocessing
|
||||
and better type handling */
|
||||
|
@ -519,3 +523,4 @@ static const char *key(void)
|
|||
}
|
||||
|
||||
STD_MOD(MOD_1, reload, NULL, NULL);
|
||||
|
||||
|
|
|
@ -73,10 +73,7 @@ PG =
|
|||
|
||||
CC ?= gcc
|
||||
CCFLAGS += -c -DNeedFunctionPrototypes=1 -funroll-loops $(OPTIMIZE)
|
||||
ifneq ($(findstring CYGWIN,${OSARCH}),CYGWIN)
|
||||
CCFLAGS += -fPIC
|
||||
endif
|
||||
|
||||
|
||||
LD = $(CC)
|
||||
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
ARCH=$(PROC)
|
||||
CFLAGS+=-Wall -O3 -funroll-loops
|
||||
ifneq (${OSARCH},CYGWIN)
|
||||
CFLAGS += -fPIC
|
||||
endif
|
||||
LIB=libilbc.a
|
||||
|
||||
OBJS= anaFilter.o iCBSearch.o packing.o \
|
||||
|
|
|
@ -23,9 +23,7 @@ LIB_TARGET_DIR = .
|
|||
|
||||
WARNINGS = -Wall -Wno-comment -Wno-error
|
||||
CFLAGS += $(OPTIMIZE) -I$(LIB_TARGET_DIR) $(WARNINGS)
|
||||
ifneq (${OSARCH},CYGWIN)
|
||||
CFLAGS += -fPIC
|
||||
endif
|
||||
#CFLAGS+= $(shell if uname -m | grep -q 86; then echo "-mpentium" ; fi)
|
||||
|
||||
#fix for PPC processors and ALPHA, And UltraSparc too
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,674 @@
|
|||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ(2.59)
|
||||
|
||||
m4_define([PBX_VERSION],
|
||||
m4_bpatsubst(m4_esyscmd([build_tools/make_version .]),
|
||||
[\([0-9.]*\)\(\w\|\W\)*],
|
||||
[\1]))
|
||||
AC_INIT(asterisk, PBX_VERSION, www.asterisk.org)
|
||||
|
||||
# cross-compile macros
|
||||
AC_CANONICAL_BUILD
|
||||
AC_CANONICAL_HOST
|
||||
AC_CANONICAL_TARGET
|
||||
|
||||
# check existence of the package
|
||||
AC_CONFIG_SRCDIR([asterisk.c])
|
||||
|
||||
# specify output header file
|
||||
AC_CONFIG_HEADER(include/autoconfig.h)
|
||||
|
||||
AC_COPYRIGHT("Asterisk")
|
||||
AC_REVISION($Revision$)
|
||||
|
||||
AC_PREFIX_DEFAULT()
|
||||
|
||||
### ** Platform.
|
||||
AC_DEFINE_UNQUOTED(PBX_PLATFORM, "${host}",
|
||||
[Define this to be the canonical name (cpu-vendor-os) of your system.])
|
||||
AC_DEFINE_UNQUOTED(PBX_CPU, "${host_cpu}",
|
||||
[Define this to be the name of the CPU of your system.])
|
||||
AC_DEFINE_UNQUOTED(PBX_VENDOR, "${host_vendor}",
|
||||
[Define this to be the name of the vendor of your system.])
|
||||
AC_DEFINE_UNQUOTED(PBX_OS, "${host_os}",
|
||||
[Define this to be the name of the OS of your system.])
|
||||
|
||||
# export some useful defines
|
||||
PBX_PLATFORM=${host}
|
||||
PBX_CPU=${host_cpu}
|
||||
PBX_VENDOR=${host_vendor}
|
||||
PBX_OS=${host_os}
|
||||
AC_SUBST(PBX_PLATFORM)
|
||||
AC_SUBST(PBX_CPU)
|
||||
AC_SUBST(PBX_VENDOR)
|
||||
AC_SUBST(PBX_OS)
|
||||
|
||||
# check for uname
|
||||
AC_PATH_TOOL([UNAME], [uname], No)
|
||||
if test ! x"${UNAME}" = xNo; then
|
||||
PBX_OSREV=$(${UNAME} -r)
|
||||
fi
|
||||
AC_SUBST(PBX_OSREV)
|
||||
|
||||
# guest OS type
|
||||
case "${host}" in
|
||||
cygwin*|mingw*|windows*|winnt)
|
||||
AC_DEFINE(Win32, 1,
|
||||
[Define according to your operating system type.])
|
||||
PBX_OSTYPE="CYGWIN"
|
||||
# this is ugly - KPF
|
||||
OSISWIN32=1
|
||||
AC_SUBST(OSISWIN32)
|
||||
;;
|
||||
*linux*)
|
||||
AC_DEFINE(Linux, 1,
|
||||
[Define according to your operating system type.])
|
||||
PBX_OSTYPE="Linux"
|
||||
;;
|
||||
*netbsd*)
|
||||
AC_DEFINE(NetBSD, 1,
|
||||
[Define according to your operating system type.])
|
||||
PBX_OSTYPE="NetBSD"
|
||||
;;
|
||||
*freebsd*)
|
||||
AC_DEFINE(FreeBSD, 1,
|
||||
[Define according to your operating system type.])
|
||||
PBX_OSTYPE="FreeBSD"
|
||||
;;
|
||||
*openbsd*)
|
||||
AC_DEFINE(OpenBSD, 1,
|
||||
[Define according to your operating system type.])
|
||||
PBX_OSTYPE="OpenBSD"
|
||||
;;
|
||||
*sun*)
|
||||
AC_DEFINE(SunOS, 1,
|
||||
[Define according to your operating system type.])
|
||||
PBX_OSTYPE="SunOS"
|
||||
;;
|
||||
*darwin*)
|
||||
AC_DEFINE(Darwin, 1,
|
||||
[Define according to your operating system type.])
|
||||
PBX_OSTYPE="Darwin"
|
||||
;;
|
||||
*)
|
||||
AC_DEFINE(Unix, 1,
|
||||
[Define according to your operating system type.])
|
||||
PBX_OSTYPE="Unix"
|
||||
;;
|
||||
esac
|
||||
AC_SUBST(PBX_OSTYPE)
|
||||
|
||||
# This needs to be before any macros that use the C compiler
|
||||
AC_GNU_SOURCE
|
||||
|
||||
AH_TOP(
|
||||
#ifndef _REENTRANT
|
||||
#define _REENTRANT
|
||||
#endif
|
||||
)
|
||||
|
||||
# cross-compile checks
|
||||
if test x"${build}" != x"${host}";
|
||||
then
|
||||
AC_CHECK_TOOL(CC, gcc, :)
|
||||
AC_CHECK_TOOL(CXX, g++, :)
|
||||
AC_CHECK_TOOL(RANLIB, ranlib, :)
|
||||
AC_CHECK_TOOL(AR, ar, :)
|
||||
|
||||
if test x"${PBX_OSTYPE}" = xWin32;
|
||||
then
|
||||
AC_CHECK_TOOL(NM, nm, :)
|
||||
AC_CHECK_TOOL(WINDRES, windres, :)
|
||||
AC_CHECK_TOOL(DLLWRAP, dllwrap, :)
|
||||
fi
|
||||
crossCompile="Yes"
|
||||
fi
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_CC
|
||||
AC_PROG_CXX
|
||||
AC_PROG_CPP
|
||||
AC_PROG_CXXCPP
|
||||
AC_PROG_AWK
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_LN_S
|
||||
AC_PROG_RANLIB
|
||||
AST_CHECK_GNU_MAKE
|
||||
|
||||
AC_PATH_PROG([GREP], [grep], :)
|
||||
AC_PATH_PROG([AR], [ar], :)
|
||||
AC_PATH_PROG([FIND], [find], :)
|
||||
AC_PATH_PROG([COMPRESS], [compress], :)
|
||||
AC_PATH_PROG([BASENAME], [basename], :)
|
||||
AC_PATH_PROG([DIRNAME], [dirname], :)
|
||||
AC_PATH_PROG([SHELL], [sh], :)
|
||||
AC_PATH_PROG([LN], [ln], :)
|
||||
AC_PATH_PROG([DOT], [dot], :)
|
||||
|
||||
AC_LANG(C)
|
||||
|
||||
AC_ARG_ENABLE(dev-mode,
|
||||
[ --enable-dev-mode Turn on developer mode],
|
||||
[case "${enableval}" in
|
||||
y|ye|yes) AST_DEVMODE=yes ;;
|
||||
n|no) AST_DEVMODE=no ;;
|
||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-dev-mode) ;;
|
||||
esac])
|
||||
AC_SUBST(AST_DEVMODE)
|
||||
|
||||
AST_EXT_LIB([asound], [snd_spcm_init], [alsa/asoundlib.h], [ALSA], [Advanced Linux Sound Architecture], [-lm -ldl])
|
||||
AST_EXT_LIB([curses], [initscr], [curses.h], [CURSES], [curses], [])
|
||||
AST_EXT_LIB([mfcr2], [mfcr2_MakeCall], [libmfcr2.h], [MFCR2], [MFCR2])
|
||||
AST_EXT_LIB([nbs], [nbs_setup], [nbs.h], [NBS], [Network Broadcast Sound])
|
||||
AST_EXT_LIB([newt], [newtBell], [newt.h], [NEWT], [newt])
|
||||
AST_EXT_LIB([odbc], [SQLConnect], [sql.h], [UNIXODBC], [unixODBC])
|
||||
AST_EXT_LIB([ogg], [ogg_sync_init], [], [OGG], [OGG])
|
||||
AST_EXT_LIB([osptk], [OSPPCryptoDecrypt], [osp/osp.h], [OSPTK], [OSP Toolkit], [-lcrypto -lssl])
|
||||
AST_EXT_LIB([popt], [poptStrerror], [popt.h], [POPT], [popt])
|
||||
AST_EXT_LIB([pri], [pri_call], [libpri.h], [LIBPRI], [ISDN PRI])
|
||||
AST_EXT_LIB([speex], [speex_encode], [speex/speex.h], [SPEEX], [Speex], [-lm])
|
||||
AST_EXT_LIB([sqlite], [sqlite_exec], [sqlite.h], [SQLITE], [SQLite])
|
||||
AST_EXT_LIB([ssl], [ssl2_connect], [openssl/ssl.h], [OPENSSL], [OpenSSL], [-lcrypto])
|
||||
AST_EXT_LIB([tds], [tds_version], [tds.h], [FREETDS], [FreeTDS])
|
||||
AST_EXT_LIB([vorbis], [vorbis_info_init], [vorbis/codec.h], [VORBIS], [Vorbis], [-lm -lvorbisenc])
|
||||
AST_EXT_LIB([z], [compress], [zlib.h], [ZLIB], [zlib])
|
||||
|
||||
if test "x${PBX_OSTYPE}" = "xLinux" ; then
|
||||
AST_EXT_LIB([ossaudio], [oss_ioctl_mixer], [linux/soundcard.h], [OSS], [Open Sound System])
|
||||
elif test "x${PBX_OSTYPE}" = "xFreeBSD" ; then
|
||||
AST_EXT_LIB([ossaudio], [oss_ioctl_mixer], [sys/soundcard.h], [OSS], [Open Sound System])
|
||||
else
|
||||
AST_EXT_LIB([ossaudio], [oss_ioctl_mixer], [soundcard.h], [OSS], [Open Sound System])
|
||||
fi
|
||||
|
||||
if test "x${PBX_OSTYPE}" = "xLinux" ; then
|
||||
AST_EXT_LIB([tonezone], [tone_zone_find], [linux/zaptel.h], [ZAPTEL], [Zaptel])
|
||||
else
|
||||
AST_EXT_LIB([tonezone], [tone_zone_find], [zaptel.h], [ZAPTEL], [Zaptel])
|
||||
fi
|
||||
|
||||
GSM_INTERNAL="yes"
|
||||
GSM_SYSTEM="yes"
|
||||
AC_ARG_WITH([gsm], AC_HELP_STRING([--with-gsm=PATH], [use libgsm files in PATH, or 'internal']), [
|
||||
case ${withval} in
|
||||
n|no)
|
||||
USE_GSM=no
|
||||
;;
|
||||
y|ye|yes)
|
||||
;;
|
||||
internal)
|
||||
GSM_SYSTEM="no"
|
||||
;;
|
||||
*)
|
||||
GSM_DIR="${withval}"
|
||||
GSM_INTERNAL="no"
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
PBX_LIBgsm=0
|
||||
|
||||
if test "${USE_GSM}" != "no"; then
|
||||
if test "${GSM_SYSTEM}" = "yes"; then
|
||||
AC_CHECK_LIB([gsm], [gsm_create], AC_DEFINE_UNQUOTED([HAVE_GSM], 1,
|
||||
[Define to indicate the GSM library]), [], -L${GSM_DIR}/lib)
|
||||
if test "${ac_cv_lib_gsm_gsm_create}" = "yes"; then
|
||||
gsm_LIB="-lgsm"
|
||||
if test "x${GSM_DIR}" != "x"; then
|
||||
gsm_LIB="-L${GSM_DIR}/lib ${gsm_LIB}"
|
||||
gsm_INCLUDE="-I${GSM_DIR}/include"
|
||||
fi
|
||||
PBX_LIBgsm=1
|
||||
GSM_INTERNAL="no"
|
||||
fi
|
||||
fi
|
||||
if test "${GSM_INTERNAL}" = "yes"; then
|
||||
gsm_LIB="internal"
|
||||
PBX_LIBgsm=1
|
||||
fi
|
||||
if test "x${PBX_LIBgsm}" = "x0"; then
|
||||
echo "***"
|
||||
echo "*** The GSM installation on this system appears to be broken."
|
||||
echo "*** Either correct the installation, or run configure"
|
||||
echo "*** including --without-gsm"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_SUBST([gsm_LIB])
|
||||
AC_SUBST([gsm_INCLUDE])
|
||||
AC_SUBST([PBX_LIBgsm])
|
||||
|
||||
AC_ARG_WITH([pq], AC_HELP_STRING([--with-pq=PATH],[use PostgreSQL files in PATH]),[
|
||||
case ${withval} in
|
||||
n|no)
|
||||
USE_PQ=no
|
||||
;;
|
||||
y|ye|yes)
|
||||
PQ_MANDATORY="yes"
|
||||
;;
|
||||
*)
|
||||
PQ_DIR="${withval}"
|
||||
PQ_MANDATORY="yes"
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
PBX_LIBpq=0
|
||||
PG_CONFIG=No
|
||||
if test "${USE_PQ}" != "no"; then
|
||||
if test "x${PQ_DIR}" != "x"; then
|
||||
AC_PATH_TOOL([PG_CONFIG], [pg_config], No, [${PQ_DIR}/bin])
|
||||
if test x"${PG_CONFIG}" = xNo; then
|
||||
echo "***"
|
||||
echo "*** pg_config was not found in the path you specified:"
|
||||
echo "*** ${PQ_DIR}/bin"
|
||||
echo "*** Either correct the installation, or run configure"
|
||||
echo "*** including --without-pq"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
AC_PATH_TOOL([PG_CONFIG], [pg_config], No)
|
||||
fi
|
||||
fi
|
||||
|
||||
if test x"${PG_CONFIG}" != xNo; then
|
||||
PQ_libdir=`pg_config --libdir`
|
||||
PQ_includedir=`pg_config --includedir`
|
||||
|
||||
AC_CHECK_LIB([pq], [PQexec], AC_DEFINE_UNQUOTED([HAVE_PQ], 1,
|
||||
[Define to indicate the PostgreSQL library]), [], -L${PQ_libdir} -lz)
|
||||
|
||||
if test "${ac_cv_lib_pq_PQexec}" = "yes"; then
|
||||
pq_LIB="-L${PQ_libdir} -lpq -lz"
|
||||
pq_INCLUDE="-I${PQ_includedir}"
|
||||
PBX_LIBpq=1
|
||||
elif test ! -z "${PQ_MANDATORY}";
|
||||
then
|
||||
echo "***"
|
||||
echo "*** The PostgreSQL installation on this system appears to be broken."
|
||||
echo "*** Either correct the installation, or run configure"
|
||||
echo "*** including --without-pq"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
AC_SUBST([pq_INCLUDE])
|
||||
AC_SUBST([pq_LIB])
|
||||
AC_SUBST([PBX_LIBpq])
|
||||
|
||||
PBX_H323=0
|
||||
AC_CHECK_HEADER([h323.h], [PBX_H323=1], [])
|
||||
AC_SUBST(PBX_H323)
|
||||
|
||||
HAVE_QUICKNET=0
|
||||
AC_CHECK_HEADER([ixjuser.h], [HAVE_QUICKNET=1],[])
|
||||
AC_SUBST(HAVE_QUICKNET)
|
||||
|
||||
AC_ARG_WITH([vpb], AC_HELP_STRING([--with-vpb=PATH],[use vpb files in PATH]),[
|
||||
case ${withval} in
|
||||
n|no)
|
||||
USE_VPB=no
|
||||
VPB_MANDATORY="yes"
|
||||
;;
|
||||
y|ye|yes)
|
||||
;;
|
||||
*)
|
||||
VPB_DIR="${withval}"
|
||||
VPB_MANDATORY="yes"
|
||||
;;
|
||||
esac
|
||||
])
|
||||
if test "${USE_VPB}" != "no"; then
|
||||
echo -n "checking for vpb_open in -lvpb..."
|
||||
saved_ldflags="${LDFLAGS}"
|
||||
LDFLAGS="${LDFLAGS} -L${VPB_DIR} -lvpb"
|
||||
AC_LINK_IFELSE(
|
||||
[
|
||||
AC_LANG_PROGRAM(
|
||||
[#include "${VPB_DIR}vpbapi.h"],
|
||||
[int q = vpb_open(0,0);])
|
||||
],
|
||||
[ AC_MSG_RESULT(yes)
|
||||
ac_cv_lib_vpb_vpb_open="yes"
|
||||
],
|
||||
[ AC_MSG_RESULT(no)
|
||||
ac_cv_lib_vpb_vpb_open="no"
|
||||
]
|
||||
)
|
||||
LDFLAGS="${saved_ldflags}"
|
||||
|
||||
PBX_LIBvpb=0
|
||||
if test "${ac_cv_lib_vpb_vpb_open}" = "yes"; then
|
||||
VPB_LIB="-lvpb"
|
||||
if test "${VPB_DIR}" != ""; then
|
||||
VPB_LIB="-L${VPB_DIR}/lib ${VPB_LIB}"
|
||||
VPB_INCLUDE="-I${VPB_DIR}/include"
|
||||
AC_SUBST([VPB_INCLUDE])
|
||||
fi
|
||||
AC_SUBST([VPB_LIB])
|
||||
PBX_LIBvpb=1
|
||||
AC_DEFINE([HAVE_LIBVPB], 1, [Define if your system has the VoiceTronix (vpb) libraries.])
|
||||
elif test ! -z "${VPB_MANDATORY}";
|
||||
then
|
||||
echo "***"
|
||||
echo "*** The VoiceTronix (vpb) installation on this system appears to be broken."
|
||||
echo "*** Either correct the installation, or run configure"
|
||||
echo "*** including --without-vpb."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
AC_SUBST([PBX_LIBvpb])
|
||||
|
||||
|
||||
AC_LANG_PUSH(C++)
|
||||
|
||||
AC_ARG_WITH([qt], AC_HELP_STRING([--with-qt=PATH],[use Qt files in PATH]),[
|
||||
case ${withval} in
|
||||
n|no)
|
||||
USE_QT=no
|
||||
QT_MANDATORY="yes"
|
||||
;;
|
||||
y|ye|yes)
|
||||
;;
|
||||
*)
|
||||
QT_DIR="${withval}"
|
||||
QT_MANDATORY="yes"
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
PBX_QT=0
|
||||
if test "${USE_QT}" != "no"; then
|
||||
echo -n "checking for QDate in -lqt..."
|
||||
saved_ldflags="${LDFLAGS}"
|
||||
LDFLAGS="${LDFLAGS} -L${QT_DIR}/lib -lqt"
|
||||
qtlib="qt"
|
||||
AC_LINK_IFELSE(
|
||||
[
|
||||
AC_LANG_PROGRAM(
|
||||
[#include "${QT_DIR}include/qdatetime.h"],
|
||||
[QDate date();])
|
||||
],
|
||||
[ac_cv_lib_qt_qt_date="yes"],
|
||||
[ac_cv_lib_qt_qt_date="no"])
|
||||
|
||||
if test "${ac_cv_lib_qt_qt_date}" = "no"; then
|
||||
qtlib="qt-mt"
|
||||
LDFLAGS="${saved_ldflags} -L${QT_DIR}/lib -lqt-mt"
|
||||
AC_LINK_IFELSE(
|
||||
[
|
||||
AC_LANG_PROGRAM(
|
||||
[#include "${QT_DIR}include/qdatetime.h"],
|
||||
[QDate date();])
|
||||
],
|
||||
[ac_cv_lib_qt_qt_date="yes"],
|
||||
[ac_cv_lib_qt_qt_date="no"])
|
||||
fi
|
||||
|
||||
LDFLAGS="${saved_ldflags}"
|
||||
|
||||
if test "${ac_cv_lib_qt_qt_date}" = "yes"; then
|
||||
AC_MSG_RESULT(yes)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
|
||||
if test "${ac_cv_lib_qt_qt_date}" = "yes"; then
|
||||
QT_LIB="-l${qtlib}"
|
||||
if test "${QT_DIR}" != ""; then
|
||||
QT_LIB="-L${QT_DIR}/lib ${QT_LIB}"
|
||||
QT_INCLUDE="-I${QT_DIR}/include"
|
||||
AC_SUBST([QT_INCLUDE])
|
||||
fi
|
||||
AC_SUBST([QT_LIB])
|
||||
PBX_QT=1
|
||||
AC_DEFINE([HAVE_LIBQT], 1, [Define if your system has the Qt library])
|
||||
AC_PATH_TOOL(QTMOC, moc, No)
|
||||
elif test ! -z "${QT_MANDATORY}";
|
||||
then
|
||||
echo "***"
|
||||
echo "*** The Qt installation on this system appears to be broken."
|
||||
echo "*** Either correct the installation, or run configure"
|
||||
echo "*** including --without-qt."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
AC_SUBST([PBX_QT])
|
||||
|
||||
|
||||
|
||||
|
||||
AC_ARG_WITH([kde], AC_HELP_STRING([--with-kde=PATH],[use KDE files in PATH]),[
|
||||
case ${withval} in
|
||||
n|no)
|
||||
USE_KDE=no
|
||||
KDE_MANDATORY="yes"
|
||||
;;
|
||||
y|ye|yes)
|
||||
;;
|
||||
*)
|
||||
KDE_DIR="${withval}"
|
||||
KDE_MANDATORY="yes"
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
PBX_KDE=0
|
||||
if test "${USE_KDE}" != "no"; then
|
||||
echo -n "checking for crashHandler in -lkdecore..."
|
||||
saved_ldflags="${LDFLAGS}"
|
||||
LDFLAGS="-I${KDE_DIR}/include ${LDFLAGS} -L${KDE_DIR}/lib -lkdecore"
|
||||
AC_LINK_IFELSE(
|
||||
[
|
||||
AC_LANG_PROGRAM(
|
||||
[#include "kcrash.h"],
|
||||
[KCrash::defaultCrashHandler(1);])
|
||||
],
|
||||
[ac_cv_lib_kde_crash="yes"],
|
||||
[ac_cv_lib_kde_crash="no"])
|
||||
|
||||
LDFLAGS="${saved_ldflags}"
|
||||
|
||||
if test "${ac_cv_lib_kde_crash}" = "yes"; then
|
||||
AC_MSG_RESULT(yes)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
|
||||
if test "${ac_cv_lib_kde_crash}" = "yes"; then
|
||||
KDE_LIBS="-lkdecore -lkdeui"
|
||||
if test "${KDE_DIR}" != ""; then
|
||||
KDE_LIBS="-L${KDE_DIR}/lib ${KDE_LIBS}"
|
||||
KDE_INCLUDE="-I${KDE_DIR}/include"
|
||||
AC_SUBST([KDE_INCLUDE])
|
||||
fi
|
||||
AC_SUBST([KDE_LIBS])
|
||||
PBX_KDE=1
|
||||
AC_DEFINE([HAVE_LIBKDE], 1, [Define if your system has the KDE library])
|
||||
elif test ! -z "${KDE_MANDATORY}";
|
||||
then
|
||||
echo "***"
|
||||
echo "*** The KDE installation on this system appears to be broken."
|
||||
echo "*** Either correct the installation, or run configure"
|
||||
echo "*** including --without-kde."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
AC_SUBST([PBX_KDE])
|
||||
|
||||
if test x"${PBX_KDE}" = x1; then
|
||||
AC_PATH_TOOL(KDEINIT, kdeinit, No)
|
||||
if test ! x"${KDEINIT}" = xNo; then
|
||||
KDEDIR=$(${DIRNAME} ${KDEINIT})
|
||||
KDEDIR=$(${DIRNAME} ${KDEDIR})
|
||||
fi
|
||||
AC_SUBST([KDEDIR])
|
||||
fi
|
||||
|
||||
AC_LANG_POP
|
||||
|
||||
PBX_GTK=0
|
||||
AC_CHECK_TOOL(GTKCONFIG, gtk-config, No)
|
||||
if test ! "x${GTKCONFIG}" = xNo; then
|
||||
GTK_INCLUDE=$(${GTKCONFIG} --cflags gthread)
|
||||
GTK_LIBS=$(${GTKCONFIG} --libs gthread)
|
||||
PBX_GTK=1
|
||||
AC_DEFINE([HAVE_GTK], 1, [Define if your system has the GTK libraries.])
|
||||
fi
|
||||
AC_SUBST(PBX_GTK)
|
||||
AC_SUBST(GTK_INCLUDE)
|
||||
AC_SUBST(GTK_LIBS)
|
||||
|
||||
PLATFORM_PTLIB="ptlib_${OSTYPE}_${MACHTYPE}_r"
|
||||
|
||||
AC_ARG_WITH([pwlib], AC_HELP_STRING([--with-pwlib=PATH],[use PWLib files in PATH]),[
|
||||
case ${withval} in
|
||||
n|no)
|
||||
USE_PWLIB=no
|
||||
;;
|
||||
y|ye|yes)
|
||||
;;
|
||||
*)
|
||||
PWLIB_DIR="${withval}"
|
||||
;;
|
||||
esac
|
||||
])
|
||||
if test "${USE_PWLIB}" != "no"; then
|
||||
echo -n "checking for existence of pwlib..."
|
||||
|
||||
saved_ldflags="${LDFLAGS}"
|
||||
LDFLAGS="${LDFLAGS} -L${PWLIB_DIR} -l${PLATFORM_PTLIB}"
|
||||
|
||||
AC_LINK_IFELSE(
|
||||
[
|
||||
AC_LANG_PROGRAM(
|
||||
[#include "${PWDIR_DIR}ptime.h"],
|
||||
[int q = PTime::IsDaylightSaving();])
|
||||
],
|
||||
[ AC_MSG_RESULT(yes)
|
||||
ac_cv_lib_pwlib="yes"
|
||||
],
|
||||
[ AC_MSG_RESULT(no)
|
||||
ac_cv_lib_pwlib="no"
|
||||
]
|
||||
)
|
||||
LDFLAGS="${saved_ldflags}"
|
||||
|
||||
PBX_LIBPWLIB=0
|
||||
|
||||
if test "${ac_cv_lib_pwlib}" = "yes"; then
|
||||
PWLIB_LIB="-l{PLATFORM_PWLIB}"
|
||||
if test "${PWLIB_DIR}" != ""; then
|
||||
PWLIB_LIB="-L${PWLIB_DIR}/lib ${PWLIB_LIB}"
|
||||
PWLIB_INCLUDE="-I${PWLIB_DIR}/include"
|
||||
AC_SUBST([PWLIB_INCLUDE])
|
||||
fi
|
||||
AC_SUBST([PWLIB_LIB])
|
||||
PBX_LIBPWLIB=1
|
||||
AC_DEFINE([HAVE_LIBPWLIB], 1, [Define if your system has the pwlib libraries.])
|
||||
elif test ! -z "${PWLIB_DIR}";
|
||||
then
|
||||
echo "***"
|
||||
echo "*** The PWLIB installation on this system appears to be broken."
|
||||
echo "*** Either correct the installation, or run configure"
|
||||
echo "*** including --without-pwlib"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
AC_SUBST([PBX_LIBPWLIB])
|
||||
|
||||
PBX_CURL=0
|
||||
AC_PATH_TOOL([CURL], [curl-config], No)
|
||||
if test ! x"${CURL}" = xNo; then
|
||||
# check for version
|
||||
CURLLIBS=$(${CURL} --libs)
|
||||
PBX_CURL=1
|
||||
AC_DEFINE([HAVE_CURL], 1, [Define if your system has the curl libraries.])
|
||||
fi
|
||||
AC_SUBST(PBX_CURL)
|
||||
AC_SUBST(CURLLIBS)
|
||||
|
||||
AC_FUNC_ALLOCA
|
||||
AC_HEADER_DIRENT
|
||||
AC_HEADER_STDC
|
||||
AC_HEADER_SYS_WAIT
|
||||
AC_CHECK_HEADERS([arpa/inet.h fcntl.h inttypes.h libintl.h limits.h locale.h malloc.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h strings.h sys/file.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h syslog.h termios.h unistd.h utime.h])
|
||||
|
||||
AC_SYS_LARGEFILE
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_HEADER_STDBOOL
|
||||
AC_C_CONST
|
||||
AC_TYPE_UID_T
|
||||
AC_C_INLINE
|
||||
AC_TYPE_MODE_T
|
||||
AC_TYPE_OFF_T
|
||||
AC_TYPE_PID_T
|
||||
AC_TYPE_SIZE_T
|
||||
AC_CHECK_MEMBERS([struct stat.st_blksize])
|
||||
AC_HEADER_TIME
|
||||
AC_STRUCT_TM
|
||||
AC_C_VOLATILE
|
||||
AC_CHECK_TYPES([ptrdiff_t])
|
||||
|
||||
# Checks for library functions.
|
||||
AC_FUNC_CHOWN
|
||||
AC_FUNC_CLOSEDIR_VOID
|
||||
AC_FUNC_ERROR_AT_LINE
|
||||
AC_FUNC_FORK
|
||||
AC_FUNC_FSEEKO
|
||||
AC_PROG_GCC_TRADITIONAL
|
||||
AC_FUNC_MALLOC
|
||||
AC_FUNC_MEMCMP
|
||||
AC_FUNC_MKTIME
|
||||
AC_FUNC_MMAP
|
||||
AC_FUNC_REALLOC
|
||||
AC_FUNC_SELECT_ARGTYPES
|
||||
AC_FUNC_SETVBUF_REVERSED
|
||||
AC_TYPE_SIGNAL
|
||||
AC_FUNC_STAT
|
||||
AC_FUNC_STRCOLL
|
||||
AC_FUNC_STRFTIME
|
||||
AC_FUNC_STRNLEN
|
||||
AC_FUNC_STRTOD
|
||||
AC_FUNC_UTIME_NULL
|
||||
AC_FUNC_VPRINTF
|
||||
AC_CHECK_FUNCS([atexit bzero dup2 endpwent floor ftruncate getcwd gethostbyname gethostname gettimeofday inet_ntoa isascii localtime_r memchr memmove memset mkdir munmap pow putenv re_comp regcomp rint select setenv socket sqrt strcasecmp strchr strcspn strdup strerror strncasecmp strndup strrchr strsep strspn strstr strtol unsetenv utime strtoq strcasestr asprintf vasprintf])
|
||||
|
||||
AC_CONFIG_FILES([build_tools/menuselect-deps makeopts])
|
||||
AC_OUTPUT
|
||||
|
||||
echo
|
||||
echo " .\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$=.. "
|
||||
echo " .\$7\$7.. .7\$\$7:. "
|
||||
echo " .\$\$:. ,\$7.7 "
|
||||
echo " .\$7. 7\$\$\$\$ .\$\$77 "
|
||||
echo " ..\$\$. \$\$\$\$\$ .\$\$\$7 "
|
||||
echo " ..7\$ .?. \$\$\$\$\$ .?. 7\$\$\$."
|
||||
echo " \$.\$. .\$\$\$7. \$\$\$\$7 .7\$\$\$. .\$\$\$."
|
||||
echo " .777. .\$\$\$\$\$\$77\$\$\$77\$\$\$\$\$7. \$\$\$,"
|
||||
echo " \$\$\$~ .7\$\$\$\$\$\$\$\$\$\$\$\$\$7. .\$\$\$."
|
||||
echo ".\$\$7 .7\$\$\$\$\$\$\$7: ?\$\$\$."
|
||||
echo "\$\$\$ ?7\$\$\$\$\$\$\$\$\$\$I .\$\$\$7 "
|
||||
echo "\$\$\$ .7\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$ :\$\$\$. "
|
||||
echo "\$\$\$ \$\$\$\$\$\$7\$\$\$\$\$\$\$\$\$\$\$\$ .\$\$\$. "
|
||||
echo "\$\$\$ \$\$\$ 7\$\$\$7 .\$\$\$ .\$\$\$. "
|
||||
echo "\$\$\$\$ \$\$\$\$7 .\$\$\$. "
|
||||
echo "7\$\$\$7 7\$\$\$\$ 7\$\$\$ "
|
||||
echo " \$\$\$\$\$ \$\$\$ "
|
||||
echo " \$\$\$\$7. \$\$ (TM) "
|
||||
echo " \$\$\$\$\$\$\$. .7\$\$\$\$\$\$ \$\$ "
|
||||
echo " \$\$\$\$\$\$\$\$\$\$\$\$7\$\$\$\$\$\$\$\$\$.\$\$\$\$\$\$ "
|
||||
echo " \$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$. "
|
||||
echo
|
||||
|
||||
echo "Package configured for: "
|
||||
echo " OS type : $PBX_OSTYPE"
|
||||
echo " host cpu : $host_cpu"
|
||||
if test "x${crossCompile}" = xYes; then
|
||||
echo ""
|
||||
echo " Cross Compilation = YES"
|
||||
echo " Target = ${host}"
|
||||
fi
|
||||
|
|
@ -26,6 +26,8 @@
|
|||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
#include "asterisk/crypto.h"
|
||||
#include "asterisk/logger.h"
|
||||
|
||||
|
|
|
@ -13,6 +13,10 @@ PROC=ultrasparc
|
|||
CFLAGS += -mtune=$(PROC) -O3 -pipe -fomit-frame-pointer -mcpu=v8
|
||||
endif
|
||||
|
||||
ifeq ($(OSARCH),Darwin)
|
||||
OSARCH_DEFINE+=-D__Darwin__
|
||||
endif
|
||||
|
||||
LIBDBSO=libdb.so.$(SOVER)
|
||||
PROG= db_dump185
|
||||
OBJ1= hash.o hash_bigkey.o hash_buf.o hash_func.o hash_log2.o hash_page.o \
|
||||
|
@ -58,7 +62,7 @@ endif
|
|||
db_dump185.o: db_dump185.c
|
||||
$(CL) -o $@ $<
|
||||
%.o: hash/%.c
|
||||
$(CL) -Ihash -o $@ $<
|
||||
$(CL) -Ihash $(OSARCH_DEFINE) -o $@ $<
|
||||
%.os: hash/%.c
|
||||
$(CL) -Ihash -fPIC -o $@ $<
|
||||
%.o: btree/%.c
|
||||
|
|
|
@ -51,8 +51,6 @@ static char sccsid[] = "@(#)hash.c 8.9 (Berkeley) 6/16/94";
|
|||
#include <assert.h>
|
||||
#endif
|
||||
|
||||
#include "../include/asterisk/compat.h"
|
||||
|
||||
#include <db.h>
|
||||
#include "hash.h"
|
||||
#include "page.h"
|
||||
|
|
6
file.c
6
file.c
|
@ -618,14 +618,14 @@ static int ast_readaudio_callback(void *data)
|
|||
if (fr)
|
||||
ast_log(LOG_WARNING, "Failed to write frame\n");
|
||||
s->owner->streamid = -1;
|
||||
#ifdef ZAPTEL_OPTIMIZATIONS
|
||||
#ifdef HAVE_ZAPTEL
|
||||
ast_settimeout(s->owner, 0, NULL, NULL);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (whennext != s->lasttimeout) {
|
||||
#ifdef ZAPTEL_OPTIMIZATIONS
|
||||
#ifdef HAVE_ZAPTEL
|
||||
if (s->owner->timingfd > -1)
|
||||
ast_settimeout(s->owner, whennext, ast_readaudio_callback, s);
|
||||
else
|
||||
|
@ -710,7 +710,7 @@ int ast_closestream(struct ast_filestream *f)
|
|||
if (f->owner->streamid > -1)
|
||||
ast_sched_del(f->owner->sched, f->owner->streamid);
|
||||
f->owner->streamid = -1;
|
||||
#ifdef ZAPTEL_OPTIMIZATIONS
|
||||
#ifdef HAVE_ZAPTEL
|
||||
ast_settimeout(f->owner, 0, NULL, NULL);
|
||||
#endif
|
||||
} else {
|
||||
|
|
|
@ -11,26 +11,10 @@
|
|||
# the GNU General Public License
|
||||
#
|
||||
|
||||
MODS:=$(patsubst %.c,%.so,$(wildcard format_*.c))
|
||||
|
||||
# OGG/Vorbis format
|
||||
# (on FreeBSD is in /usr/local/include/...
|
||||
|
||||
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/vorbis/codec.h),)
|
||||
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/local/include/vorbis/codec.h),)
|
||||
MODS:=$(filter-out format_ogg_vorbis.so,$(MODS))
|
||||
endif
|
||||
endif
|
||||
MODS:=$(filter-out $(MENUSELECT_FORMATS),$(patsubst %.c,%.so,$(wildcard format_*.c)))
|
||||
|
||||
GSMLIB=../codecs/gsm/lib/libgsm.a
|
||||
|
||||
ifeq (${OSARCH},CYGWIN)
|
||||
CYGSOLINK=-Wl,--out-implib=lib$@.a -Wl,--export-all-symbols
|
||||
CYGSOLIB=-L.. -L. -lasterisk.dll
|
||||
else
|
||||
CFLAGS+=-fPIC
|
||||
endif
|
||||
|
||||
all: depend $(MODS)
|
||||
|
||||
clean-depend:
|
||||
|
@ -40,17 +24,17 @@ clean: clean-depend
|
|||
rm -f *.so *.o
|
||||
|
||||
%.so : %.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB}
|
||||
$(CC) $(SOLINK) -o $@ $<
|
||||
|
||||
ifneq ($(wildcard .depend),)
|
||||
include .depend
|
||||
endif
|
||||
|
||||
format_mp3.so : format_mp3.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} -lm
|
||||
|
||||
format_ogg_vorbis.so : format_ogg_vorbis.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} -logg -lvorbis -lvorbisenc -lm
|
||||
$(CC) $(SOLINK) -o $@ $< $(OGG_LIB) $(VORBIS_LIB)
|
||||
|
||||
format_ogg_vorbis.o: format_ogg_vorbis.c
|
||||
$(CC) -c -o $@ $(CFLAGS) $(OGG_INCLUDE) $(VORBIS_INCLUDE) $<
|
||||
|
||||
install: all
|
||||
for x in $(MODS); do $(INSTALL) -m 755 $$x $(DESTDIR)$(MODULES_DIR) ; done
|
||||
|
|
|
@ -21,6 +21,11 @@
|
|||
* \ingroup formats
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>libvorbis</depend>
|
||||
<depend>ogg</depend>
|
||||
***/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
@ -561,3 +566,4 @@ static const char *key(void)
|
|||
}
|
||||
|
||||
STD_MOD1;
|
||||
|
||||
|
|
|
@ -11,31 +11,17 @@
|
|||
# the GNU General Public License
|
||||
#
|
||||
|
||||
MODS:=$(patsubst %.c,%.so,$(wildcard func_*.c))
|
||||
|
||||
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/odbcinst.h $(CROSS_COMPILE_TARGET)/usr/local/include/odbcinst.h),)
|
||||
MODS:=$(filter-out func_odbc.so,$(MODS))
|
||||
endif
|
||||
MODS:=$(filter-out $(MENUSELECT_FUNCS),$(patsubst %.c,%.so,$(wildcard func_*.c)))
|
||||
|
||||
# TODO This check needs to be handled with autoconf
|
||||
ifeq ($(OSARCH),SunOS)
|
||||
ifneq ($(shell if [ 0x`$(CROSS_COMPILE_BIN)curl-config --vernum` -ge 0x70907 ]; then echo "OK" ; fi),)
|
||||
CURLLIBS:=$(shell $(CROSS_COMPILE_BIN)curl-config --libs)
|
||||
endif
|
||||
ifeq ($(shell if [ 0x`$(CROSS_COMPILE_BIN)curl-config --vernum` -ge 0x70907 ]; then echo "OK" ; fi),)
|
||||
MODS:=$(filter-out func_curl.so,$(MODS))
|
||||
endif
|
||||
else
|
||||
ifneq ($(shell if [[ 0x`$(CROSS_COMPILE_BIN)curl-config --vernum` -ge 0x70907 ]]; then echo "OK" ; fi),)
|
||||
CURLLIBS:=$(shell $(CROSS_COMPILE_BIN)curl-config --libs)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq (${CURLLIBS},)
|
||||
MODS:=$(filter-out func_curl.so,$(MODS))
|
||||
endif
|
||||
|
||||
ifeq (${OSARCH},CYGWIN)
|
||||
CYGSOLINK=-Wl,--out-implib=lib$@.a -Wl,--export-all-symbols
|
||||
CYGSOLIB=-L.. -L. -lasterisk.dll
|
||||
else
|
||||
CFLAGS+=-fPIC
|
||||
ifeq ($(shell if [[ 0x`$(CROSS_COMPILE_BIN)curl-config --vernum` -ge 0x70907 ]]; then echo "OK" ; fi),)
|
||||
MODS:=$(filter-out func_curl.so,$(MODS))
|
||||
endif
|
||||
endif
|
||||
|
||||
all: $(MODS)
|
||||
|
@ -47,13 +33,19 @@ clean: clean-depend
|
|||
rm -f *.so *.o
|
||||
|
||||
%.so : %.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB}
|
||||
$(CC) $(SOLINK) -o $@ $<
|
||||
|
||||
func_curl.so: func_curl.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} $(CURLLIBS)
|
||||
$(CC) $(SOLINK) -o $@ $< $(CURL_LIB)
|
||||
|
||||
func_curl.o: func_curl.c
|
||||
$(CC) -c -o $@ $(CFLAGS) $(CURL_INCLUDE) $<
|
||||
|
||||
func_odbc.so: func_odbc.o
|
||||
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} -lodbc
|
||||
$(CC) $(SOLINK) -o $@ $< $(ODBC_LIB)
|
||||
|
||||
func_odbc.o: func_odbc.c
|
||||
$(CC) -c -o $@ $(CFLAGS) $(ODBC_INCLUDE) $<
|
||||
|
||||
install: all
|
||||
for x in $(MODS); do $(INSTALL) -m 755 $$x $(DESTDIR)$(MODULES_DIR) ; done
|
||||
|
|
|
@ -28,6 +28,10 @@
|
|||
* \ingroup functions
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>curl</depend>
|
||||
***/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
@ -186,3 +190,4 @@ static const char *key(void)
|
|||
}
|
||||
|
||||
STD_MOD(MOD_1 | NO_USECOUNT, NULL, NULL, NULL);
|
||||
|
||||
|
|
|
@ -24,6 +24,10 @@
|
|||
* \author Tilghman Lesher <func_odbc__200508@the-tilghman.com>
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>unixodbc</depend>
|
||||
***/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -667,4 +671,6 @@ static const char *key(void)
|
|||
{
|
||||
return ASTERISK_GPL_KEY;
|
||||
}
|
||||
|
||||
STD_MOD(MOD_1, reload, NULL, NULL);
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* General Definitions for Asterisk top level program
|
||||
*
|
||||
* Copyright (C) 1999-2005, Mark Spencer
|
||||
* Copyright (C) 1999-2006, Digium, Inc.
|
||||
*
|
||||
* Mark Spencer <markster@digium.com>
|
||||
*
|
||||
|
@ -15,11 +15,11 @@
|
|||
* \brief Asterisk main include file. File version handling, generic pbx functions.
|
||||
*/
|
||||
|
||||
#include "asterisk/compat.h"
|
||||
|
||||
#ifndef _ASTERISK_H
|
||||
#define _ASTERISK_H
|
||||
|
||||
#include "asterisk/compat.h"
|
||||
|
||||
#define DEFAULT_LANGUAGE "en"
|
||||
|
||||
#define DEFAULT_SAMPLE_RATE 8000
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
* \brief Asterisk memory usage debugging
|
||||
*/
|
||||
|
||||
#ifndef NO_AST_MM
|
||||
#ifndef _ASTERISK_ASTMM_H
|
||||
#define _ASTERISK_ASTMM_H
|
||||
|
||||
|
@ -81,4 +80,3 @@ void __ast_mm_init(void);
|
|||
#else
|
||||
#error "NEVER INCLUDE astmm.h DIRECTLY!!"
|
||||
#endif /* _ASTERISK_ASTMM_H */
|
||||
#endif
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Asterisk -- A telephony toolkit for Linux.
|
||||
*
|
||||
* Copyright (C) 1999-2005, Mark Spencer
|
||||
* Copyright (C) 1999-2006, Digium, Inc.
|
||||
*
|
||||
* Mark Spencer <markster@digium.com>
|
||||
*
|
||||
|
@ -16,6 +16,18 @@
|
|||
#ifndef _COMPAT_H
|
||||
#define _COMPAT_H
|
||||
|
||||
#ifndef HAVE_STRSEP
|
||||
char* strsep(char** str, const char* delims);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SETENV
|
||||
int setenv(const char *name, const char *value, int overwrite);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_UNSETENV
|
||||
int unsetenv(const char *name);
|
||||
#endif
|
||||
|
||||
#ifdef SOLARIS
|
||||
#define __BEGIN_DECLS
|
||||
#define __END_DECLS
|
||||
|
@ -56,9 +68,6 @@ typedef unsigned short u_int16_t;
|
|||
typedef unsigned int u_int32_t;
|
||||
#endif
|
||||
|
||||
char* strsep(char** str, const char* delims);
|
||||
int setenv(const char *name, const char *value, int overwrite);
|
||||
int unsetenv(const char *name);
|
||||
#endif /* SOLARIS */
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
|
@ -71,19 +80,8 @@ int unsetenv(const char *name);
|
|||
#endif
|
||||
#endif /* __CYGWIN__ */
|
||||
|
||||
#define HAVE_ASPRINTF
|
||||
#define HAVE_VASPRINTF
|
||||
#define HAVE_STRTOQ
|
||||
|
||||
#ifdef _BSD_SOURCE
|
||||
#define HAVE_GETLOADAVG
|
||||
#endif
|
||||
|
||||
#ifdef __linux__
|
||||
#include <inttypes.h>
|
||||
#define HAVE_STRCASESTR
|
||||
#define HAVE_STRNDUP
|
||||
#define HAVE_STRNLEN
|
||||
#endif
|
||||
|
||||
#ifdef __Darwin__
|
||||
|
@ -94,14 +92,7 @@ int unsetenv(const char *name);
|
|||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#ifdef SOLARIS
|
||||
#undef HAVE_ASPRINTF
|
||||
#undef HAVE_VASPRINTF
|
||||
#undef HAVE_STRTOQ
|
||||
#endif
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
#undef HAVE_STRTOQ
|
||||
typedef unsigned long long uint64_t;
|
||||
#endif
|
||||
|
||||
|
|
|
@ -0,0 +1,103 @@
|
|||
CC=@CC@
|
||||
HOST_CC=@CC@
|
||||
CXX=@CXX@
|
||||
|
||||
INSTALL=@INSTALL@
|
||||
GREP=@GREP@
|
||||
AR=@AR@
|
||||
RANLIB=@RANLIB@
|
||||
FIND=@FIND@
|
||||
COMPRESS=@COMPRESS@
|
||||
BASENAME=@BASENAME@
|
||||
SHELL=@SHELL@
|
||||
LN=@LN@
|
||||
QTMOC=@QTMOC@
|
||||
DOT=@DOT@
|
||||
|
||||
CROSS_ARCH=@PBX_OSTYPE@
|
||||
CROSS_PROC=@PBX_CPU@
|
||||
PROC=@PBX_CPU@
|
||||
OSARCH=@PBX_OSTYPE@
|
||||
OSREV=@PBX_OSREV@
|
||||
|
||||
INSTALL_PREFIX=@prefix@
|
||||
|
||||
AST_DEVMODE=@AST_DEVMODE@
|
||||
|
||||
OGG_LIB=@ogg_LIB@
|
||||
OGG_INCLUDE=@ogg_INCLUDE@
|
||||
|
||||
VORBIS_LIB=@vorbis_LIB@
|
||||
VORBIS_INCLUDE=@vorbis_INCLUDE@
|
||||
|
||||
ASOUND_LIB=@asound_LIB@
|
||||
ASOUND_INCLUDE=@asound_INCLUDE@
|
||||
|
||||
NBS_LIB=@nbs_LIB@
|
||||
NBS_INCLUDE=@nbs_INCLUDE@
|
||||
|
||||
OSSAUDIO_LIB=@ossaudio_LIB@
|
||||
OSSAUDIO_INCLUDE=@ossaudio_INCLUDE@
|
||||
|
||||
SPEEX_LIB=@speex_LIB@
|
||||
SPEEX_INCLUDE=@speex_INCLUDE@
|
||||
|
||||
ZAPTEL_LIB=@tonezone_LIB@
|
||||
ZAPTEL_INCLUDE=@tonezone_INCLUDE@
|
||||
|
||||
VPB_LIB=@VPB_LIB@
|
||||
VPB_INCLUDE=@VPB_INCLUDE@
|
||||
|
||||
PRI_LIB=@pri_LIB@
|
||||
PRI_INCLUDE=@pri_INCLUDE@
|
||||
|
||||
MFCR2_LIB=@mfcr2_LIB@
|
||||
MFCR2_INCLUDE=@mfcr2_INCLUDE@
|
||||
|
||||
OSPTK_LIB=@osptk_LIB@
|
||||
OSPTK_INCLUDE=@osptk_INCLUDE@
|
||||
|
||||
ODBC_LIB=@odbc_LIB@
|
||||
ODBC_INCLUDE=@odbc_INCLUDE@
|
||||
|
||||
PGSQL_LIB=@pq_LIB@
|
||||
PGSQL_INCLUDE=@pq_INCLUDE@
|
||||
|
||||
SQLITE_LIB=@sqlite_LIB@
|
||||
SQLITE_INCLUDE=@sqlite_INCLUDE@
|
||||
|
||||
TDS_LIB=@tds_LIB@
|
||||
TDS_INCLUDE=@tds_INCLUDE@
|
||||
|
||||
POPT_LIB=@popt_LIB@
|
||||
POPT_INCLUDE=@popt_INCLUDE@
|
||||
|
||||
NEWT_LIB=@newt_LIB@
|
||||
NEWT_INCLUDE=@newt_INCLUDE@
|
||||
|
||||
PWLIB_LIB=@PWLIB_LIB@
|
||||
PWLIB_INCLUDE=@PWLIB_INCLUDE@
|
||||
|
||||
SSL_LIB=@ssl_LIB@
|
||||
SSL_INCLUDE=@ssl_INCLUDE@
|
||||
|
||||
Z_LIB=@z_LIB@
|
||||
Z_INCLUDE=@z_INCLUDE@
|
||||
|
||||
QT_LIB=@QT_LIB@
|
||||
QT_INCLUDE=@QT_INCLUDE@
|
||||
|
||||
KDEDIR=@KDEDIR@
|
||||
KDE_INCLUDE=@KDE_INCLUDE@
|
||||
KDE_LIBS=@KDE_LIBS@
|
||||
|
||||
GTK_INCLUDE=@GTK_INCLUDE@
|
||||
GTK_LIBS=@GTK_LIBS@
|
||||
|
||||
CURL_LIB=@CURLLIBS@
|
||||
|
||||
GSM_LIB=@gsm_LIB@
|
||||
GSM_INCLUDE=@gsm_INCLUDE@
|
||||
|
||||
CURSES_LIB=@curses_LIB@
|
||||
CURSES_INCLUDE=@curses_INCLUDE@
|
|
@ -0,0 +1,12 @@
|
|||
*.bck
|
||||
*.bak
|
||||
Makefile
|
||||
autom4te*.cache
|
||||
config.cache
|
||||
config.h
|
||||
config.log
|
||||
config.status
|
||||
libmxml.a
|
||||
mxml.list
|
||||
mxmldoc
|
||||
testmxml
|
|
@ -0,0 +1,5 @@
|
|||
Mini-XML 2.2.2 is now available for download from:
|
||||
|
||||
http://www.easysw.com/~mike/mxml/software.php
|
||||
|
||||
Mini-XML 2.2.2 fixes a bug in the reading of custom data nodes.
|
|
@ -0,0 +1,213 @@
|
|||
CHANGES - 05/19/2005
|
||||
--------------------
|
||||
|
||||
CHANGES IN Mini-XML 2.2.2
|
||||
|
||||
- mxmlLoad*() did not treat custom data as opaque, so
|
||||
whitespace characters would be lost.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 2.2.1
|
||||
|
||||
- mxmlLoadFd(), mxmlLoadFile(), and mxmlLoadString() now
|
||||
correctly return NULL on error (STR #21)
|
||||
- mxmlNewInteger(), mxmlNewOpaque(), mxmlNewReal(),
|
||||
mxmlNewText(), and mxmlNewTextf() incorrectly required
|
||||
a parent node (STR #22)
|
||||
- Fixed an XML output bug in mxmldoc.
|
||||
- The "make install" target now uses the install command
|
||||
to set the proper permissions on UNIX/Linux/OSX.
|
||||
- Fixed a MingW/Cygwin compilation problem (STR #18)
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 2.2
|
||||
|
||||
- Added shared library support (STR #17)
|
||||
- mxmlLoad*() now returns an error when an XML stream
|
||||
contains illegal control characters (STR #10)
|
||||
- mxmlLoad*() now returns an error when an element
|
||||
contains two attributes with the same name in
|
||||
conformance with the XML spec (STR #16)
|
||||
- Added support for CDATA (STR #14, STR #15)
|
||||
- Updated comment and processing instruction handling -
|
||||
no entity support per XML specification.
|
||||
- Added checking for invalid comment termination ("--->"
|
||||
is not allowed)
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 2.1
|
||||
|
||||
- Added support for custom data nodes (STR #6)
|
||||
- Now treat UTF-8 sequences which are longer than
|
||||
necessary as an error (STR #4)
|
||||
- Fixed entity number support (STR #8)
|
||||
- Fixed mxmlLoadString() bug with UTF-8 (STR #7)
|
||||
- Fixed entity lookup bug (STR #5)
|
||||
- Added mxmlLoadFd() and mxmlSaveFd() functions.
|
||||
- Fixed multi-word UTF-16 handling.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 2.0
|
||||
|
||||
- New programmers manual.
|
||||
- Added Visual C++ project files for Microsoft Windows
|
||||
users.
|
||||
- Added optimizations to mxmldoc, mxmlSaveFile(), and
|
||||
mxmlIndexNew() (STR #2)
|
||||
- mxmlEntityAddCallback() now returns an integer status
|
||||
(STR #2)
|
||||
- Added UTF-16 support (input only; all output is UTF-8)
|
||||
- Added index functions to build a searchable index of
|
||||
XML nodes.
|
||||
- Added character entity callback interface to support
|
||||
additional character entities beyond those defined in
|
||||
the XHTML specification.
|
||||
- Added support for XHTML character entities.
|
||||
- The mxmldoc utility now produces XML output which
|
||||
conforms to an updated XML schema, described in the file
|
||||
"doc/mxmldoc.xsd".
|
||||
- Changed the whitespace callback interface to return
|
||||
strings instead of a single character, allowing for
|
||||
greater control over the formatting of XML files
|
||||
written using Mini-XML. THIS CHANGE WILL REQUIRE
|
||||
CHANGES TO YOUR 1.x CODE IF YOU USE WHITESPACE
|
||||
CALLBACKS.
|
||||
- The mxmldoc utility is now capable of documenting C++
|
||||
classes, functions, and structures, and correctly
|
||||
handles C++ comments.
|
||||
- Added new modular tests for mxmldoc.
|
||||
- Updated the mxmldoc output to be more compatible with
|
||||
embedding in manuals produced with HTMLDOC.
|
||||
- The makefile incorrectly included a "/" separator
|
||||
between the destination path and install path. This
|
||||
caused problems when building and installing with
|
||||
MingW.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 1.3
|
||||
|
||||
- Fixes for mxmldoc.
|
||||
- Added support for reading standard HTML entity names.
|
||||
- mxmlLoadString/File() did not decode character
|
||||
entities in element names, attribute names, or
|
||||
attribute values.
|
||||
- mxmlLoadString/File() would crash when loading non-
|
||||
conformant XML data under an existing parent (top)
|
||||
node.
|
||||
- Fixed several bugs in the mxmldoc utility.
|
||||
- Added new error callback function to catch a variety
|
||||
of errors and log them to someplace other than stderr.
|
||||
- The mxmlElementSetAttr() function now allows for NULL
|
||||
attribute values.
|
||||
- The load and save functions now properly handle quoted
|
||||
element and attribute name strings properly, e.g. for
|
||||
!DOCTYPE declarations.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 1.2
|
||||
|
||||
- Added new "set" methods to set the value of a node.
|
||||
- Added new formatted text methods mxmlNewTextf() and
|
||||
mxmlSetTextf() to create/set a text node value using
|
||||
printf-style formats.
|
||||
- Added new standard callbacks for use with the mxmlLoad
|
||||
functions.
|
||||
- Updated the HTML documentation to include examples of
|
||||
the walk and load function output.
|
||||
- Added --with/without-ansi configure option to control
|
||||
the strdup() function check.
|
||||
- Added --with/without-snprintf configure option to
|
||||
control the snprintf() and vsnprintf() function
|
||||
checks.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 1.1.2
|
||||
|
||||
- The mxml(3) man page wasn't updated for the string
|
||||
functions.
|
||||
- mxmlSaveString() returned the wrong number of
|
||||
characters.
|
||||
- mxml_add_char() updated the buffer pointer in the
|
||||
wrong place.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 1.1.1
|
||||
|
||||
- The private mxml_add_ch() function did not update the
|
||||
start-of-buffer pointer which could cause a crash when
|
||||
using mxmlSaveString().
|
||||
- The private mxml_write_ws() function called putc()
|
||||
instead of using the proper callback which could cause
|
||||
a crash when using mxmlSaveString().
|
||||
- Added a mxmlSaveAllocString() convenience function for
|
||||
saving an XML node tree to an allocated string.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 1.1
|
||||
|
||||
- The mxmlLoadFile() function now uses dynamically
|
||||
allocated string buffers for element names, attribute
|
||||
names, and attribute values. Previously they were
|
||||
capped at 16383, 255, and 255 bytes, respectively.
|
||||
- Added a new mxmlLoadString() function for loading an
|
||||
XML node tree from a string.
|
||||
- Added a new mxmlSaveString() function for saving an
|
||||
XML node tree to a string.
|
||||
- Add emulation of strdup() if the local platform does
|
||||
not provide the function.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 1.0
|
||||
|
||||
- The mxmldoc program now handles function arguments,
|
||||
structures, unions, enumerations, classes, and
|
||||
typedefs properly.
|
||||
- Documentation provided via mxmldoc and more in-line
|
||||
comments in the code.
|
||||
- Added man pages and packaging files.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 0.93
|
||||
|
||||
- New mxmldoc example program that is also used to
|
||||
create and update code documentation using XML and
|
||||
produce HTML reference pages.
|
||||
- Added mxmlAdd() and mxmlRemove() functions to add and
|
||||
remove nodes from a tree. This provides more
|
||||
flexibility over where the nodes are inserted and
|
||||
allows nodes to be moved within the tree as needed.
|
||||
- mxmlLoadFile() now correctly handles comments.
|
||||
- mxmlLoadFile() now supports the required "gt", "quot",
|
||||
and "nbsp" character entities.
|
||||
- mxmlSaveFile() now uses newlines as whitespace
|
||||
when valid to do so.
|
||||
- mxmlFindElement() now also takes attribute name and
|
||||
attribute value string arguments to limit the search
|
||||
to specific elements with attributes and/or values.
|
||||
NULL pointers can be used as "wildcards".
|
||||
- Added uninstall target to makefile, and auto-reconfig
|
||||
if Makefile.in or configure.in are changed.
|
||||
- mxmlFindElement(), mxmlWalkNext(), and mxmlWalkPrev()
|
||||
now all provide "descend" arguments to control whether
|
||||
they descend into child nodes in the tree.
|
||||
- Fixed some whitespace issues in mxmlLoadFile().
|
||||
- Fixed Unicode output and whitespace issues in
|
||||
mxmlSaveFile().
|
||||
- mxmlSaveFile() now supports a whitespace callback to
|
||||
provide more human-readable XML output under program
|
||||
control.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 0.92
|
||||
|
||||
- mxmlSaveFile() didn't return a value on success.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 0.91
|
||||
|
||||
- mxmlWalkNext() would go into an infinite loop.
|
||||
|
||||
|
||||
CHANGES IN Mini-XML 0.9
|
||||
|
||||
- Initial public release.
|
|
@ -0,0 +1,482 @@
|
|||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the library GPL. It is
|
||||
numbered 2 because it goes with version 2 of the ordinary GPL.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Library General Public License, applies to some
|
||||
specially designated Free Software Foundation software, and to any
|
||||
other libraries whose authors decide to use it. You can use it for
|
||||
your libraries, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if
|
||||
you distribute copies of the library, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link a program with the library, you must provide
|
||||
complete object files to the recipients so that they can relink them
|
||||
with the library, after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
Our method of protecting your rights has two steps: (1) copyright
|
||||
the library, and (2) offer you this license which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
Also, for each distributor's protection, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
library. If the library is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original
|
||||
version, so that any problems introduced by others will not reflect on
|
||||
the original authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that companies distributing free
|
||||
software will individually obtain patent licenses, thus in effect
|
||||
transforming the program into proprietary software. To prevent this,
|
||||
we have made it clear that any patent must be licensed for everyone's
|
||||
free use or not licensed at all.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the ordinary
|
||||
GNU General Public License, which was designed for utility programs. This
|
||||
license, the GNU Library General Public License, applies to certain
|
||||
designated libraries. This license is quite different from the ordinary
|
||||
one; be sure to read it in full, and don't assume that anything in it is
|
||||
the same as in the ordinary license.
|
||||
|
||||
The reason we have a separate public license for some libraries is that
|
||||
they blur the distinction we usually make between modifying or adding to a
|
||||
program and simply using it. Linking a program with a library, without
|
||||
changing the library, is in some sense simply using the library, and is
|
||||
analogous to running a utility program or application program. However, in
|
||||
a textual and legal sense, the linked executable is a combined work, a
|
||||
derivative of the original library, and the ordinary General Public License
|
||||
treats it as such.
|
||||
|
||||
Because of this blurred distinction, using the ordinary General
|
||||
Public License for libraries did not effectively promote software
|
||||
sharing, because most developers did not use the libraries. We
|
||||
concluded that weaker conditions might promote sharing better.
|
||||
|
||||
However, unrestricted linking of non-free programs would deprive the
|
||||
users of those programs of all benefit from the free status of the
|
||||
libraries themselves. This Library General Public License is intended to
|
||||
permit developers of non-free programs to use free libraries, while
|
||||
preserving your freedom as a user of such programs to change the free
|
||||
libraries that are incorporated in them. (We have not seen how to achieve
|
||||
this as regards changes in header files, but we have achieved it as regards
|
||||
changes in the actual functions of the Library.) The hope is that this
|
||||
will lead to faster development of free libraries.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, while the latter only
|
||||
works together with the library.
|
||||
|
||||
Note that it is possible for a library to be covered by the ordinary
|
||||
General Public License rather than by this special one.
|
||||
|
||||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library which
|
||||
contains a notice placed by the copyright holder or other authorized
|
||||
party saying it may be distributed under the terms of this Library
|
||||
General Public License (also called "this License"). Each licensee is
|
||||
addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also compile or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
c) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
d) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the source code distributed need not include anything that is normally
|
||||
distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Library General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
Appendix: How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this library; if not, write to the Free
|
||||
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
|
@ -0,0 +1,363 @@
|
|||
#
|
||||
# "$Id$"
|
||||
#
|
||||
# Makefile for Mini-XML, a small XML-like file parsing library.
|
||||
#
|
||||
# Copyright 2003-2005 by Michael Sweet.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Library General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
|
||||
#
|
||||
# Compiler tools definitions...
|
||||
#
|
||||
|
||||
AR = @AR@
|
||||
ARFLAGS = @ARFLAGS@
|
||||
CC = @CC@
|
||||
CFLAGS = $(OPTIM) @CFLAGS@ @CPPFLAGS@
|
||||
CP = @CP@
|
||||
DSO = @DSO@
|
||||
DSOFLAGS = @DSOFLAGS@
|
||||
LDFLAGS = $(OPTIM) @LDFLAGS@
|
||||
INSTALL = @INSTALL@
|
||||
LIBMXML = @LIBMXML@
|
||||
LN = @LN@ -s
|
||||
MKDIR = @MKDIR@
|
||||
NROFF = @NROFF@
|
||||
OPTIM = @OPTIM@
|
||||
RANLIB = @RANLIB@
|
||||
RM = @RM@ -f
|
||||
SHELL = /bin/sh
|
||||
|
||||
|
||||
#
|
||||
# Configured directories...
|
||||
#
|
||||
|
||||
prefix = @prefix@
|
||||
exec_prefix = @exec_prefix@
|
||||
bindir = @bindir@
|
||||
includedir = @includedir@
|
||||
libdir = @libdir@
|
||||
mandir = @mandir@
|
||||
docdir = @docdir@
|
||||
BUILDROOT = $(DSTROOT)
|
||||
|
||||
|
||||
#
|
||||
# Manpage extensions...
|
||||
#
|
||||
|
||||
CAT1EXT = @CAT1EXT@
|
||||
CAT3EXT = @CAT3EXT@
|
||||
MAN1EXT = @MAN1EXT@
|
||||
MAN3EXT = @MAN3EXT@
|
||||
|
||||
|
||||
#
|
||||
# Install commands...
|
||||
#
|
||||
|
||||
INSTALL_BIN = $(LIBTOOL) $(INSTALL) -m 755 -s
|
||||
INSTALL_DATA = $(INSTALL) -m 644
|
||||
INSTALL_DIR = $(INSTALL) -d
|
||||
INSTALL_LIB = $(LIBTOOL) $(INSTALL) -m 755
|
||||
INSTALL_MAN = $(INSTALL) -m 644
|
||||
INSTALL_SCRIPT = $(INSTALL) -m 755
|
||||
|
||||
|
||||
#
|
||||
# Rules...
|
||||
#
|
||||
|
||||
.SUFFIXES: .0 .1 .3 .c .man .o
|
||||
.c.o:
|
||||
$(CC) $(CFLAGS) -c $<
|
||||
.man.0 .man.1 .man.3:
|
||||
$(RM) $@
|
||||
$(NROFF) -man $< >$@
|
||||
|
||||
|
||||
#
|
||||
# Targets...
|
||||
#
|
||||
|
||||
DOCFILES = doc/mxml.html doc/mxmldoc.xsd \
|
||||
README COPYING CHANGES
|
||||
PUBLIBOBJS = mxml-attr.o mxml-entity.o mxml-file.o mxml-index.o \
|
||||
mxml-node.o mxml-search.o mxml-set.o
|
||||
LIBOBJS = $(PUBLIBOBJS) mxml-private.o mxml-string.o
|
||||
OBJS = mxmldoc.o testmxml.o $(LIBOBJS)
|
||||
TARGETS = $(LIBMXML) mxmldoc doc/mxml.$(CAT3EXT) \
|
||||
doc/mxmldoc.$(CAT1EXT) testmxml mxml.xml
|
||||
|
||||
|
||||
#
|
||||
# Make everything...
|
||||
#
|
||||
|
||||
all: Makefile configure config.h $(TARGETS)
|
||||
|
||||
|
||||
#
|
||||
# Clean everything...
|
||||
#
|
||||
|
||||
clean:
|
||||
$(RM) $(OBJS) $(TARGETS)
|
||||
$(RM) mxmldoc-static libmxml.a
|
||||
$(RM) *.bck *.bak
|
||||
$(RM) config.cache config.log config.status
|
||||
$(RM) -r autom4te*.cache
|
||||
|
||||
|
||||
#
|
||||
# Install everything...
|
||||
#
|
||||
|
||||
install: $(TARGETS) install-$(LIBMXML) install-libmxml.a
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(bindir)
|
||||
$(INSTALL_BIN) mxmldoc $(BUILDROOT)$(bindir)
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(docdir)
|
||||
for file in $(DOCFILES); do \
|
||||
$(INSTALL_MAN) $$file $(BUILDROOT)$(docdir); \
|
||||
done
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(includedir)
|
||||
$(INSTALL_DATA) mxml.h $(BUILDROOT)$(includedir)
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(libdir)/pkgconfig
|
||||
$(INSTALL_DATA) mxml.pc $(BUILDROOT)$(libdir)/pkgconfig
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(mandir)/cat1
|
||||
$(INSTALL_MAN) doc/mxmldoc.$(CAT1EXT) $(BUILDROOT)$(mandir)/cat1/mxmldoc.$(CAT1EXT)
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(mandir)/cat3
|
||||
$(INSTALL_MAN) doc/mxml.$(CAT3EXT) $(BUILDROOT)$(mandir)/cat3/mxml.$(CAT3EXT)
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(mandir)/man1
|
||||
$(INSTALL_MAN) doc/mxmldoc.man $(BUILDROOT)$(mandir)/man1/mxmldoc.$(MAN1EXT)
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(mandir)/man3
|
||||
$(INSTALL_MAN) doc/mxml.man $(BUILDROOT)$(mandir)/man3/mxml.$(MAN3EXT)
|
||||
|
||||
install-libmxml.a:
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(libdir)
|
||||
$(INSTALL_LIB) libmxml.a $(BUILDROOT)$(libdir)
|
||||
|
||||
install-libmxml.so.1.0:
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(libdir)
|
||||
$(INSTALL_LIB) libmxml.so.1.0 $(BUILDROOT)$(libdir)
|
||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.so
|
||||
$(LN) libmxml.so.1.0 $(BUILDROOT)$(libdir)/libmxml.so
|
||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.so.1
|
||||
$(LN) libmxml.so.1.0 $(BUILDROOT)$(libdir)/libmxml.so.1
|
||||
|
||||
install-libmxml.sl.1:
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(libdir)
|
||||
$(INSTALL_LIB) libmxml.sl.1 $(BUILDROOT)$(libdir)
|
||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.so
|
||||
$(LN) libmxml.sl.1 $(BUILDROOT)$(libdir)/libmxml.sl
|
||||
|
||||
install-libmxml.1.dylib:
|
||||
$(INSTALL_DIR) $(BUILDROOT)$(libdir)
|
||||
$(INSTALL_LIB) libmxml.1.dylib $(BUILDROOT)$(libdir)
|
||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.dylib
|
||||
$(LN) libmxml.1.dylib $(BUILDROOT)$(libdir)/libmxml.dylib
|
||||
|
||||
|
||||
#
|
||||
# Uninstall everything...
|
||||
#
|
||||
|
||||
uninstall: uninstall-$(LIBMXML) uninstall-libmxml.a
|
||||
$(RM) $(BUILDROOT)$(bindir)/mxmldoc
|
||||
$(RM) -r $(BUILDROOT)$(docdir)
|
||||
$(RM) $(BUILDROOT)$(includedir)/mxml.h
|
||||
$(RM) $(BUILDROOT)$(libdir)/pkgconfig/mxml.pc
|
||||
$(RM) $(BUILDROOT)$(mandir)/cat1/mxmldoc.$(CAT1EXT)
|
||||
$(RM) $(BUILDROOT)$(mandir)/cat3/mxml.$(CAT3EXT)
|
||||
$(RM) $(BUILDROOT)$(mandir)/man1/mxmldoc.$(MAN1EXT)
|
||||
$(RM) $(BUILDROOT)$(mandir)/man3/mxml.$(MAN3EXT)
|
||||
|
||||
uninstall-libmxml.a:
|
||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.a
|
||||
|
||||
uninstall-libmxml.so.1.0:
|
||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.so
|
||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.so.1
|
||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.so.1.0
|
||||
|
||||
uninstall-libmxml.sl.1:
|
||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.sl
|
||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.sl.1
|
||||
|
||||
uninstall-libmxml.1.dylib:
|
||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.dylib
|
||||
$(RM) $(BUILDROOT)$(libdir)/libmxml.1.dylib
|
||||
|
||||
|
||||
#
|
||||
# Make packages using EPM (http://www.easysw.com/epm/)
|
||||
#
|
||||
|
||||
epm: all
|
||||
epm --output-dir dist -v -f native mxml
|
||||
epm --output-dir dist -v -f portable mxml
|
||||
|
||||
|
||||
#
|
||||
# autoconf stuff...
|
||||
#
|
||||
|
||||
Makefile: configure Makefile.in
|
||||
if test -f config.status; then \
|
||||
./config.status --recheck; \
|
||||
./config.status; \
|
||||
else \
|
||||
./configure; \
|
||||
fi
|
||||
touch config.h
|
||||
|
||||
|
||||
configure: configure.in
|
||||
autoconf
|
||||
if test -f config.status; then \
|
||||
./config.status --recheck; \
|
||||
./config.status; \
|
||||
else \
|
||||
./configure; \
|
||||
fi
|
||||
touch config.h
|
||||
|
||||
|
||||
config.h: configure config.h.in
|
||||
autoconf
|
||||
if test -f config.status; then \
|
||||
./config.status --recheck; \
|
||||
./config.status; \
|
||||
else \
|
||||
./configure; \
|
||||
fi
|
||||
touch config.h
|
||||
|
||||
|
||||
#
|
||||
# libmxml.a
|
||||
#
|
||||
|
||||
libmxml.a: $(LIBOBJS)
|
||||
$(RM) $@
|
||||
$(AR) $(ARFLAGS) $@ $(LIBOBJS)
|
||||
$(RANLIB) $@
|
||||
|
||||
$(LIBOBJS): mxml.h
|
||||
|
||||
|
||||
#
|
||||
# libmxml.so.1.0
|
||||
#
|
||||
|
||||
libmxml.so.1.0: $(LIBOBJS)
|
||||
$(DSO) $(DSOFLAGS) -o libmxml.so.1.0 $(LIBOBJS)
|
||||
$(RM) libmxml.so libmxml.so.1
|
||||
$(LN) libmxml.so.1.0 libmxml.so
|
||||
$(LN) libmxml.so.1.0 libmxml.so.1
|
||||
|
||||
|
||||
#
|
||||
# libmxml.sl.1
|
||||
#
|
||||
|
||||
libmxml.sl.1: $(LIBOBJS)
|
||||
$(DSO) $(DSOFLAGS) -o libmxml.sl.1 $(LIBOBJS)
|
||||
$(RM) libmxml.sl libmxml.sl.1
|
||||
$(LN) libmxml.sl.1 libmxml.sl
|
||||
|
||||
|
||||
#
|
||||
# libmxml.1.dylib
|
||||
#
|
||||
|
||||
libmxml.1.dylib: $(LIBOBJS)
|
||||
$(DSO) $(DSOFLAGS) -o libmxml.1.dylib \
|
||||
-install_name $(libdir)/libmxml.dylib \
|
||||
-current_version 1.0.0 \
|
||||
-compatibility_version 1.0.0 \
|
||||
$(LIBOBJS)
|
||||
$(RM) libmxml.dylib libmxml.1.dylib
|
||||
$(LN) libmxml.1.dylib libmxml.dylib
|
||||
|
||||
|
||||
#
|
||||
# mxmldoc
|
||||
#
|
||||
|
||||
mxmldoc: $(LIBMXML) mxmldoc.o
|
||||
$(CC) $(LDFLAGS) -o $@ mxmldoc.o -L. -lmxml
|
||||
|
||||
mxmldoc-static: libmxml.a mxmldoc.o
|
||||
$(CC) $(LDFLAGS) -o $@ mxmldoc.o libmxml.a
|
||||
|
||||
mxmldoc.o: mxml.h
|
||||
|
||||
|
||||
#
|
||||
# testmxml
|
||||
#
|
||||
|
||||
testmxml: libmxml.a testmxml.o
|
||||
$(CC) $(LDFLAGS) -o $@ testmxml.o libmxml.a
|
||||
@echo Testing library...
|
||||
./testmxml test.xml >temp1.xml 2>temp1s.xml
|
||||
./testmxml temp1.xml >temp2.xml 2>temp2s.xml
|
||||
@if cmp temp1.xml temp2.xml; then \
|
||||
echo Stdio file test passed!; \
|
||||
$(RM) temp2.xml temp2s.xml; \
|
||||
else \
|
||||
echo Stdio file test failed!; \
|
||||
fi
|
||||
@if cmp temp1.xml temp1s.xml; then \
|
||||
echo String test passed!; \
|
||||
$(RM) temp1.xml temp1s.xml; \
|
||||
else \
|
||||
echo String test failed!; \
|
||||
fi
|
||||
@if cmp test.xml test.xmlfd; then \
|
||||
echo File descriptor test passed!; \
|
||||
$(RM) test.xmlfd; \
|
||||
else \
|
||||
echo File descriptor test failed!; \
|
||||
fi
|
||||
|
||||
testmxml.o: mxml.h
|
||||
|
||||
|
||||
#
|
||||
# mxml.xml
|
||||
#
|
||||
|
||||
mxml.xml: mxmldoc-static mxml.h $(PUBLIBOBJS:.o=.c)
|
||||
$(RM) mxml.xml
|
||||
./mxmldoc-static mxml.xml mxml.h $(PUBLIBOBJS:.o=.c) >doc/reference.html
|
||||
|
||||
valgrind: mxmldoc-static
|
||||
$(RM) valgrind.xml
|
||||
valgrind --tool=memcheck --leak-check=yes ./mxmldoc-static \
|
||||
valgrind.xml mxml.h $(PUBLIBOBJS:.o=.c) \
|
||||
>valgrind.html 2>valgrind.out
|
||||
|
||||
|
||||
#
|
||||
# All object files depend on the makefile...
|
||||
#
|
||||
|
||||
$(OBJS): Makefile config.h
|
||||
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
#
|
|
@ -0,0 +1,204 @@
|
|||
README - 05/19/2005
|
||||
-------------------
|
||||
|
||||
|
||||
INTRODUCTION
|
||||
|
||||
This README file describes the Mini-XML library version
|
||||
2.2.2.
|
||||
|
||||
Mini-XML is a small XML parsing library that you can use to
|
||||
read XML and XML-like data files in your application without
|
||||
requiring large non-standard libraries. Mini-XML only
|
||||
requires an ANSI C compatible compiler (GCC works, as do
|
||||
most vendors' ANSI C compilers) and a "make" program.
|
||||
|
||||
Mini-XML provides the following functionality:
|
||||
|
||||
- Reading of UTF-8 and UTF-16 and writing of UTF-8
|
||||
encoded XML files and strings.
|
||||
- Data is stored in a linked-list tree structure,
|
||||
preserving the XML data hierarchy.
|
||||
- Supports arbitrary element names, attributes, and
|
||||
attribute values with no preset limits, just available
|
||||
memory.
|
||||
- Supports integer, real, opaque ("cdata"), and text
|
||||
data types in "leaf" nodes.
|
||||
- Functions for creating and managing trees of data.
|
||||
- "Find" and "walk" functions for easily locating and
|
||||
navigating trees of data.
|
||||
|
||||
Mini-XML doesn't do validation or other types of processing
|
||||
on the data based upon schema files or other sources of
|
||||
definition information.
|
||||
|
||||
|
||||
BUILDING Mini-XML
|
||||
|
||||
Mini-XML comes with an autoconf-based configure script; just
|
||||
type the following command to get things going:
|
||||
|
||||
./configure
|
||||
|
||||
The default install prefix is /usr/local, which can be
|
||||
overridden using the --prefix option:
|
||||
|
||||
./configure --prefix=/foo
|
||||
|
||||
Other configure options can be found using the --help
|
||||
option:
|
||||
|
||||
./configure --help
|
||||
|
||||
Once you have configured the software, type "make" to do the
|
||||
build and run the test program to verify that things are
|
||||
working, as follows:
|
||||
|
||||
make
|
||||
|
||||
If you are using Mini-XML under Microsoft Windows with
|
||||
Visual C++, use the included project files in the "vcnet"
|
||||
subdirectory to build the library instead.
|
||||
|
||||
|
||||
INSTALLING Mini-XML
|
||||
|
||||
The "install" target will install Mini-XML in the lib and
|
||||
include directories:
|
||||
|
||||
make install
|
||||
|
||||
Once you have installed it, use the "-lmxml" option to link
|
||||
your application against it.
|
||||
|
||||
|
||||
DOCUMENTATION
|
||||
|
||||
The documentation is available in the "doc" subdirectory in
|
||||
the files "mxml.html" (HTML) and "mxml.pdf" (PDF). You can
|
||||
also look at the "testmxml.c" and "mxmldoc.c" source files
|
||||
for examples of using Mini-XML.
|
||||
|
||||
Mini-XML provides a single header file which you include:
|
||||
|
||||
#include <mxml.h>
|
||||
|
||||
Nodes are defined by the "mxml_node_t" structure; the "type"
|
||||
member defines the node type (element, integer, opaque,
|
||||
real, or text) which determines which value you want to look
|
||||
at in the "value" union. New nodes can be created using the
|
||||
"mxmlNewElement()", "mxmlNewInteger()", "mxmlNewOpaque()",
|
||||
"mxmlNewReal()", and "mxmlNewText()" functions. Only
|
||||
elements can have child nodes, and the top node must be an
|
||||
element, usually "?xml".
|
||||
|
||||
You load an XML file using the "mxmlLoadFile()" function:
|
||||
|
||||
FILE *fp;
|
||||
mxml_node_t *tree;
|
||||
|
||||
fp = fopen("filename.xml", "r");
|
||||
tree = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK);
|
||||
fclose(fp);
|
||||
|
||||
Similarly, you save an XML file using the "mxmlSaveFile()"
|
||||
function:
|
||||
|
||||
FILE *fp;
|
||||
mxml_node_t *tree;
|
||||
|
||||
fp = fopen("filename.xml", "w");
|
||||
mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
|
||||
fclose(fp);
|
||||
|
||||
The "mxmlLoadString()", "mxmlSaveAllocString()", and
|
||||
"mxmlSaveString()" functions load XML node trees from and
|
||||
save XML node trees to strings:
|
||||
|
||||
char buffer[8192];
|
||||
char *ptr;
|
||||
mxml_node_t *tree;
|
||||
|
||||
...
|
||||
tree = mxmlLoadString(NULL, buffer, MXML_NO_CALLBACK);
|
||||
|
||||
...
|
||||
mxmlSaveString(tree, buffer, sizeof(buffer), MXML_NO_CALLBACK);
|
||||
|
||||
...
|
||||
ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
|
||||
|
||||
You can find a named element/node using the
|
||||
"mxmlFindElement()" function:
|
||||
|
||||
mxml_node_t *node = mxmlFindElement(tree, tree, "name", "attr",
|
||||
"value", MXML_DESCEND);
|
||||
|
||||
The "name", "attr", and "value" arguments can be passed as
|
||||
NULL to act as wildcards, e.g.:
|
||||
|
||||
/* Find the first "a" element */
|
||||
node = mxmlFindElement(tree, tree, "a", NULL, NULL, MXML_DESCEND);
|
||||
|
||||
/* Find the first "a" element with "href" attribute */
|
||||
node = mxmlFindElement(tree, tree, "a", "href", NULL, MXML_DESCEND);
|
||||
|
||||
/* Find the first "a" element with "href" to a URL */
|
||||
node = mxmlFindElement(tree, tree, "a", "href",
|
||||
"http://www.easysw.com/~mike/mxml/",
|
||||
MXML_DESCEND);
|
||||
|
||||
/* Find the first element with a "src" attribute*/
|
||||
node = mxmlFindElement(tree, tree, NULL, "src", NULL, MXML_DESCEND);
|
||||
|
||||
/* Find the first element with a "src" = "foo.jpg" */
|
||||
node = mxmlFindElement(tree, tree, NULL, "src", "foo.jpg",
|
||||
MXML_DESCEND);
|
||||
|
||||
You can also iterate with the same function:
|
||||
|
||||
mxml_node_t *node;
|
||||
|
||||
for (node = mxmlFindElement(tree, tree, "name", NULL, NULL,
|
||||
MXML_DESCEND);
|
||||
node != NULL;
|
||||
node = mxmlFindElement(node, tree, "name", NULL, NULL,
|
||||
MXML_DESCEND))
|
||||
{
|
||||
... do something ...
|
||||
}
|
||||
|
||||
Finally, once you are done with the XML data, use the
|
||||
"mxmlDelete()" function to recursively free the memory that
|
||||
is used for a particular node or the entire tree:
|
||||
|
||||
mxmlDelete(tree);
|
||||
|
||||
|
||||
GETTING HELP AND REPORTING PROBLEMS
|
||||
|
||||
You can email me at "mxml@easysw.com" to report problems
|
||||
and/or ask for help. Just don't expect an instant response,
|
||||
as I get a *lot* of email...
|
||||
|
||||
|
||||
LEGAL STUFF
|
||||
|
||||
The Mini-XML library is Copyright 2003-2005 by Michael Sweet.
|
||||
|
||||
This library is free software; you can redistribute it
|
||||
and/or modify it under the terms of the GNU Library General
|
||||
Public License as published by the Free Software Foundation;
|
||||
either version 2 of the License, or (at your option) any
|
||||
later version.
|
||||
|
||||
This library is distributed in the hope that it will be
|
||||
useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
PURPOSE. See the GNU Library General Public License for
|
||||
more details.
|
||||
|
||||
You should have received a copy of the GNU Library General
|
||||
Public License along with this library; if not, write to the
|
||||
Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
|
||||
02139, USA.
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Configuration file for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2005 by Michael Sweet.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
/*
|
||||
* Version number...
|
||||
*/
|
||||
|
||||
#define MXML_VERSION ""
|
||||
|
||||
|
||||
/*
|
||||
* Do we have the vsnprintf() function?
|
||||
*/
|
||||
|
||||
#undef HAVE_VSNPRINTF
|
||||
|
||||
|
||||
/*
|
||||
* Do we have the strXXX() functions?
|
||||
*/
|
||||
|
||||
#undef HAVE_STRDUP
|
||||
|
||||
|
||||
/*
|
||||
* Define prototypes for string functions as needed...
|
||||
*/
|
||||
|
||||
# ifndef HAVE_STRDUP
|
||||
extern char *mxml_strdup(const char *);
|
||||
# define strdup mxml_strdup
|
||||
# endif /* !HAVE_STRDUP */
|
||||
|
||||
extern char *mxml_strdupf(const char *, va_list);
|
||||
|
||||
# ifndef HAVE_VSNPRINTF
|
||||
extern int mxml_vsnprintf(char *, size_t, const char *, va_list);
|
||||
# define vsnprintf mxml_vsnprintf
|
||||
# endif /* !HAVE_VSNPRINTF */
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,293 @@
|
|||
dnl
|
||||
dnl "$Id$"
|
||||
dnl
|
||||
dnl Configuration script for Mini-XML, a small XML-like file parsing library.
|
||||
dnl
|
||||
dnl Copyright 2003-2005 by Michael Sweet.
|
||||
dnl
|
||||
dnl This program is free software; you can redistribute it and/or
|
||||
dnl modify it under the terms of the GNU Library General Public
|
||||
dnl License as published by the Free Software Foundation; either
|
||||
dnl version 2, or (at your option) any later version.
|
||||
dnl
|
||||
dnl This program is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
dnl GNU General Public License for more details.
|
||||
dnl
|
||||
|
||||
dnl Specify a source file from the distribution...
|
||||
AC_INIT(mxml.h)
|
||||
|
||||
dnl Set the name of the config header file...
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
||||
dnl Version number...
|
||||
VERSION=2.2.2
|
||||
AC_SUBST(VERSION)
|
||||
AC_DEFINE_UNQUOTED(MXML_VERSION, "Mini-XML v$VERSION")
|
||||
|
||||
dnl Clear default debugging options and set normal optimization by
|
||||
dnl default unless the user asks for debugging specifically.
|
||||
CFLAGS="${CFLAGS:=}"
|
||||
CXXFLAGS="${CXXFLAGS:=}"
|
||||
LDFLAGS="${LDFLAGS:=}"
|
||||
AC_SUBST(LDFLAGS)
|
||||
OPTIM="-O"
|
||||
AC_SUBST(OPTIM)
|
||||
|
||||
AC_ARG_WITH(ansi, [ --with-ansi set full ANSI C mode, default=no],
|
||||
use_ansi="$withval",
|
||||
use_ansi="no")
|
||||
|
||||
AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging, default=no],
|
||||
if eval "test x$enable_debug = xyes"; then
|
||||
OPTIM="-g"
|
||||
else
|
||||
LDFLAGS="$LDFLAGS -s"
|
||||
fi)
|
||||
|
||||
AC_ARG_WITH(docdir, [ --with-docdir set directory for documentation, default=${prefix}/share/doc/mxml],
|
||||
docdir="$withval",
|
||||
docdir="NONE")
|
||||
|
||||
AC_SUBST(docdir)
|
||||
|
||||
AC_ARG_WITH(vsnprintf, [ --with-vsnprintf use vsnprintf emulation functions, default=auto],
|
||||
use_vsnprintf="$withval",
|
||||
use_vsnprintf="no")
|
||||
|
||||
dnl Get the operating system and version number...
|
||||
uname=`uname`
|
||||
uversion=`uname -r | sed -e '1,$s/[[^0-9]]//g'`
|
||||
if test x$uname = xIRIX64; then
|
||||
uname="IRIX"
|
||||
fi
|
||||
|
||||
dnl Checks for programs...
|
||||
AC_PROG_CC
|
||||
AC_PROG_CXX
|
||||
AC_PROG_INSTALL
|
||||
if test "$INSTALL" = "$ac_install_sh"; then
|
||||
# Use full path to install-sh script...
|
||||
INSTALL="`pwd`/install-sh -c"
|
||||
fi
|
||||
AC_PROG_RANLIB
|
||||
AC_PATH_PROG(AR,ar)
|
||||
AC_PATH_PROG(CP,cp)
|
||||
AC_PATH_PROG(LN,ln)
|
||||
AC_PATH_PROG(MKDIR,mkdir)
|
||||
AC_PATH_PROG(NROFF,nroff)
|
||||
if test x$NROFF = x; then
|
||||
AC_PATH_PROG(GROFF,groff)
|
||||
if test x$GROFF = x; then
|
||||
NROFF="echo"
|
||||
else
|
||||
NROFF="$GROFF -T ascii"
|
||||
fi
|
||||
fi
|
||||
AC_PATH_PROG(RM,rm)
|
||||
|
||||
dnl Flags for "ar" command...
|
||||
case "$uname" in
|
||||
Darwin* | *BSD*)
|
||||
ARFLAGS="-rcv"
|
||||
;;
|
||||
*)
|
||||
ARFLAGS="crvs"
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(ARFLAGS)
|
||||
|
||||
dnl Checks for string functions.
|
||||
if test "x$use_ansi" != xyes; then
|
||||
AC_CHECK_FUNCS(strdup)
|
||||
fi
|
||||
|
||||
if test "x$use_vsnprintf" != xyes; then
|
||||
AC_CHECK_FUNCS(vsnprintf)
|
||||
fi
|
||||
|
||||
dnl Shared library support...
|
||||
DSO="${DSO:=:}"
|
||||
DSOFLAGS="${DSOFLAGS:=}"
|
||||
|
||||
AC_ARG_ENABLE(shared, [ --enable-shared turn on shared libraries, default=no])
|
||||
|
||||
if test x$enable_shared = xyes; then
|
||||
AC_MSG_CHECKING(for shared library support)
|
||||
PICFLAG=1
|
||||
|
||||
case "$uname" in
|
||||
SunOS* | UNIX_S*)
|
||||
AC_MSG_RESULT(yes)
|
||||
LIBMXML="libmxml.so.1.0"
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-h,libmxml.so.1 -G -R\$(libdir) \$(OPTIM)"
|
||||
LDFLAGS="$LDFLAGS -R\$(libdir)"
|
||||
;;
|
||||
|
||||
HP-UX*)
|
||||
AC_MSG_RESULT(yes)
|
||||
LIBMXML="libmxml.sl.1"
|
||||
DSO="ld"
|
||||
DSOFLAGS="$DSOFLAGS -b -z +h libmxml.sl.1 +s +b \$(libdir)"
|
||||
LDFLAGS="$LDFLAGS -Wl,+s,+b,\$(libdir)"
|
||||
;;
|
||||
|
||||
IRIX)
|
||||
AC_MSG_RESULT(yes)
|
||||
LIBMXML="libmxml.so.1.0"
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-rpath,\$(libdir),-set_version,sgi1.0,-soname,libmxml.so.1 -shared \$(OPTIM)"
|
||||
;;
|
||||
|
||||
OSF1* | Linux | GNU)
|
||||
AC_MSG_RESULT(yes)
|
||||
LIBMXML="libmxml.so.1.0"
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-soname,libmxml.so.1,-rpath,\$(libdir) -shared \$(OPTIM)"
|
||||
LDFLAGS="$LDFLAGS -Wl,-rpath,\$(libdir)"
|
||||
;;
|
||||
|
||||
*BSD*)
|
||||
AC_MSG_RESULT(yes)
|
||||
LIBMXML="libmxml.so.1.0"
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS -Wl,-soname,libmxml.so.1,-R\$(libdir) -shared \$(OPTIM)"
|
||||
LDFLAGS="$LDFLAGS -Wl,-R\$(libdir)"
|
||||
;;
|
||||
|
||||
Darwin*)
|
||||
AC_MSG_RESULT(yes)
|
||||
LIBMXML="libmxml.1.dylib"
|
||||
DSO="\$(CC)"
|
||||
DSOFLAGS="$DSOFLAGS \$(RC_CFLAGS) -dynamiclib -lc"
|
||||
;;
|
||||
|
||||
*)
|
||||
AC_MSG_RESULT(no)
|
||||
AC_MSG_WARN(shared libraries not supported on this platform.)
|
||||
PICFLAG=0
|
||||
LIBMXML="libmxml.a"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
PICFLAG=0
|
||||
LIBMXML="libmxml.a"
|
||||
fi
|
||||
|
||||
AC_SUBST(DSO)
|
||||
AC_SUBST(DSOFLAGS)
|
||||
AC_SUBST(LIBMXML)
|
||||
AC_SUBST(PICFLAG)
|
||||
|
||||
dnl Add -Wall for GCC...
|
||||
if test -n "$GCC"; then
|
||||
CFLAGS="-Wall $CFLAGS"
|
||||
|
||||
if test "x$use_ansi" = xyes; then
|
||||
CFLAGS="-ansi -pedantic $CFLAGS"
|
||||
fi
|
||||
|
||||
if test $PICFLAG = 1 -a $uname != AIX; then
|
||||
OPTIM="-fPIC $OPTIM"
|
||||
fi
|
||||
else
|
||||
case $uname in
|
||||
HP-UX*)
|
||||
CFLAGS="-Ae $CFLAGS"
|
||||
OPTIM="+DAportable $OPTIM"
|
||||
|
||||
if test $PICFLAG = 1; then
|
||||
OPTIM="+z $OPTIM"
|
||||
fi
|
||||
;;
|
||||
|
||||
UNIX_SVR* | SunOS*)
|
||||
if test $PICFLAG = 1; then
|
||||
OPTIM="-KPIC $OPTIM"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
dnl Fix "prefix" variable if it hasn't been specified...
|
||||
if test "$prefix" = "NONE"; then
|
||||
prefix="/usr/local"
|
||||
fi
|
||||
|
||||
dnl Fix "exec_prefix" variable if it hasn't been specified...
|
||||
if test "$exec_prefix" = "NONE"; then
|
||||
exec_prefix="$prefix"
|
||||
fi
|
||||
|
||||
dnl Fix "docdir" variable if it hasn't been specified...
|
||||
if test "$docdir" = "NONE"; then
|
||||
docdir="$datadir/doc/mxml"
|
||||
fi
|
||||
|
||||
dnl Fix "mandir" variable if it hasn't been specified...
|
||||
if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/usr"; then
|
||||
case "$uname" in
|
||||
*BSD* | Darwin* | Linux*)
|
||||
# BSD, Darwin (MacOS X), and Linux
|
||||
mandir="/usr/share/man"
|
||||
;;
|
||||
IRIX*)
|
||||
# SGI IRIX
|
||||
mandir="/usr/share/catman/u_man"
|
||||
;;
|
||||
*)
|
||||
# All others
|
||||
mandir="/usr/man"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
dnl More manpage stuff...
|
||||
case "$uname" in
|
||||
*BSD* | Darwin*)
|
||||
# *BSD
|
||||
CAT1EXT="0"
|
||||
MAN1EXT="1"
|
||||
CAT3EXT="0"
|
||||
MAN3EXT="3"
|
||||
;;
|
||||
*)
|
||||
# All others
|
||||
CAT1EXT="1"
|
||||
MAN1EXT="1"
|
||||
CAT3EXT="3"
|
||||
MAN3EXT="3"
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(CAT1EXT)
|
||||
AC_SUBST(CAT3EXT)
|
||||
AC_SUBST(MAN1EXT)
|
||||
AC_SUBST(MAN3EXT)
|
||||
|
||||
dnl pkg-config stuff...
|
||||
if test "$includedir" != /usr/include; then
|
||||
PC_CFLAGS="-I$includedir"
|
||||
else
|
||||
PC_CFLAGS=""
|
||||
fi
|
||||
|
||||
if test "$libdir" != /usr/lib; then
|
||||
PC_LIBS="-L$libdir -lmxml"
|
||||
else
|
||||
PC_LIBS="-lmxml"
|
||||
fi
|
||||
|
||||
AC_SUBST(PC_CFLAGS)
|
||||
AC_SUBST(PC_LIBS)
|
||||
|
||||
dnl Output the makefile, etc...
|
||||
AC_OUTPUT(Makefile mxml.list mxml.pc)
|
||||
|
||||
dnl
|
||||
dnl End of "$Id$".
|
||||
dnl
|
|
@ -0,0 +1,251 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# install - install a program, script, or datafile
|
||||
# This comes from X11R5 (mit/util/scripts/install.sh).
|
||||
#
|
||||
# Copyright 1991 by the Massachusetts Institute of Technology
|
||||
#
|
||||
# Permission to use, copy, modify, distribute, and sell this software and its
|
||||
# documentation for any purpose is hereby granted without fee, provided that
|
||||
# the above copyright notice appear in all copies and that both that
|
||||
# copyright notice and this permission notice appear in supporting
|
||||
# documentation, and that the name of M.I.T. not be used in advertising or
|
||||
# publicity pertaining to distribution of the software without specific,
|
||||
# written prior permission. M.I.T. makes no representations about the
|
||||
# suitability of this software for any purpose. It is provided "as is"
|
||||
# without express or implied warranty.
|
||||
#
|
||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||
# `make' implicit rules from creating a file called install from it
|
||||
# when there is no Makefile.
|
||||
#
|
||||
# This script is compatible with the BSD install script, but was written
|
||||
# from scratch. It can only install one file at a time, a restriction
|
||||
# shared with many OS's install programs.
|
||||
|
||||
|
||||
# set DOITPROG to echo to test this script
|
||||
|
||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||
doit="${DOITPROG-}"
|
||||
|
||||
|
||||
# put in absolute paths if you don't have them in your path; or use env. vars.
|
||||
|
||||
mvprog="${MVPROG-mv}"
|
||||
cpprog="${CPPROG-cp}"
|
||||
chmodprog="${CHMODPROG-chmod}"
|
||||
chownprog="${CHOWNPROG-chown}"
|
||||
chgrpprog="${CHGRPPROG-chgrp}"
|
||||
stripprog="${STRIPPROG-strip}"
|
||||
rmprog="${RMPROG-rm}"
|
||||
mkdirprog="${MKDIRPROG-mkdir}"
|
||||
|
||||
transformbasename=""
|
||||
transform_arg=""
|
||||
instcmd="$mvprog"
|
||||
chmodcmd="$chmodprog 0755"
|
||||
chowncmd=""
|
||||
chgrpcmd=""
|
||||
stripcmd=""
|
||||
rmcmd="$rmprog -f"
|
||||
mvcmd="$mvprog"
|
||||
src=""
|
||||
dst=""
|
||||
dir_arg=""
|
||||
|
||||
while [ x"$1" != x ]; do
|
||||
case $1 in
|
||||
-c) instcmd="$cpprog"
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-d) dir_arg=true
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-m) chmodcmd="$chmodprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-s) stripcmd="$stripprog"
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
|
||||
shift
|
||||
continue;;
|
||||
|
||||
*) if [ x"$src" = x ]
|
||||
then
|
||||
src=$1
|
||||
else
|
||||
# this colon is to work around a 386BSD /bin/sh bug
|
||||
:
|
||||
dst=$1
|
||||
fi
|
||||
shift
|
||||
continue;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ x"$src" = x ]
|
||||
then
|
||||
echo "install: no input file specified"
|
||||
exit 1
|
||||
else
|
||||
:
|
||||
fi
|
||||
|
||||
if [ x"$dir_arg" != x ]; then
|
||||
dst=$src
|
||||
src=""
|
||||
|
||||
if [ -d $dst ]; then
|
||||
instcmd=:
|
||||
chmodcmd=""
|
||||
else
|
||||
instcmd=$mkdirprog
|
||||
fi
|
||||
else
|
||||
|
||||
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
|
||||
# might cause directories to be created, which would be especially bad
|
||||
# if $src (and thus $dsttmp) contains '*'.
|
||||
|
||||
if [ -f $src -o -d $src ]
|
||||
then
|
||||
:
|
||||
else
|
||||
echo "install: $src does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ x"$dst" = x ]
|
||||
then
|
||||
echo "install: no destination specified"
|
||||
exit 1
|
||||
else
|
||||
:
|
||||
fi
|
||||
|
||||
# If destination is a directory, append the input filename; if your system
|
||||
# does not like double slashes in filenames, you may need to add some logic
|
||||
|
||||
if [ -d $dst ]
|
||||
then
|
||||
dst="$dst"/`basename $src`
|
||||
else
|
||||
:
|
||||
fi
|
||||
fi
|
||||
|
||||
## this sed command emulates the dirname command
|
||||
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
|
||||
|
||||
# Make sure that the destination directory exists.
|
||||
# this part is taken from Noah Friedman's mkinstalldirs script
|
||||
|
||||
# Skip lots of stat calls in the usual case.
|
||||
if [ ! -d "$dstdir" ]; then
|
||||
defaultIFS='
|
||||
'
|
||||
IFS="${IFS-${defaultIFS}}"
|
||||
|
||||
oIFS="${IFS}"
|
||||
# Some sh's can't handle IFS=/ for some reason.
|
||||
IFS='%'
|
||||
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
|
||||
IFS="${oIFS}"
|
||||
|
||||
pathcomp=''
|
||||
|
||||
while [ $# -ne 0 ] ; do
|
||||
pathcomp="${pathcomp}${1}"
|
||||
shift
|
||||
|
||||
if [ ! -d "${pathcomp}" ] ;
|
||||
then
|
||||
$mkdirprog "${pathcomp}"
|
||||
else
|
||||
:
|
||||
fi
|
||||
|
||||
pathcomp="${pathcomp}/"
|
||||
done
|
||||
fi
|
||||
|
||||
if [ x"$dir_arg" != x ]
|
||||
then
|
||||
$doit $instcmd $dst &&
|
||||
|
||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi &&
|
||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi &&
|
||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi &&
|
||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi
|
||||
else
|
||||
|
||||
# If we're going to rename the final executable, determine the name now.
|
||||
|
||||
if [ x"$transformarg" = x ]
|
||||
then
|
||||
dstfile=`basename $dst`
|
||||
else
|
||||
dstfile=`basename $dst $transformbasename |
|
||||
sed $transformarg`$transformbasename
|
||||
fi
|
||||
|
||||
# don't allow the sed command to completely eliminate the filename
|
||||
|
||||
if [ x"$dstfile" = x ]
|
||||
then
|
||||
dstfile=`basename $dst`
|
||||
else
|
||||
:
|
||||
fi
|
||||
|
||||
# Make a temp file name in the proper directory.
|
||||
|
||||
dsttmp=$dstdir/#inst.$$#
|
||||
|
||||
# Move or copy the file name to the temp name
|
||||
|
||||
$doit $instcmd $src $dsttmp &&
|
||||
|
||||
trap "rm -f ${dsttmp}" 0 &&
|
||||
|
||||
# and set any options; do chmod last to preserve setuid bits
|
||||
|
||||
# If any of these fail, we abort the whole thing. If we want to
|
||||
# ignore errors from any of these, just make sure not to ignore
|
||||
# errors from the above "$doit $instcmd $src $dsttmp" command.
|
||||
|
||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi &&
|
||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi &&
|
||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi &&
|
||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
|
||||
$doit $rmcmd -f $dstdir/$dstfile &&
|
||||
$doit $mvcmd $dsttmp $dstdir/$dstfile
|
||||
|
||||
fi &&
|
||||
|
||||
|
||||
exit 0
|
|
@ -0,0 +1,181 @@
|
|||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Attribute support code for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2005 by Michael Sweet.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxmlElementGetAttr() - Get an attribute.
|
||||
* mxmlElementSetAttr() - Set an attribute.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mxml.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlElementGetAttr()' - Get an attribute.
|
||||
*
|
||||
* This function returns NULL if the node is not an element or the
|
||||
* named attribute does not exist.
|
||||
*/
|
||||
|
||||
const char * /* O - Attribute value or NULL */
|
||||
mxmlElementGetAttr(mxml_node_t *node, /* I - Element node */
|
||||
const char *name) /* I - Name of attribute */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
mxml_attr_t *attr; /* Cirrent attribute */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlElementGetAttr(node=%p, name=\"%s\")\n",
|
||||
node, name ? name : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_ELEMENT || !name)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Look for the attribute...
|
||||
*/
|
||||
|
||||
for (i = node->value.element.num_attrs, attr = node->value.element.attrs;
|
||||
i > 0;
|
||||
i --, attr ++)
|
||||
if (!strcmp(attr->name, name))
|
||||
return (attr->value);
|
||||
|
||||
/*
|
||||
* Didn't find attribute, so return NULL...
|
||||
*/
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlElementSetAttr()' - Set an attribute.
|
||||
*
|
||||
* If the named attribute already exists, the value of the attribute
|
||||
* is replaced by the new string value. The string value is copied
|
||||
* into the element node. This function does nothing if the node is
|
||||
* not an element.
|
||||
*/
|
||||
|
||||
void
|
||||
mxmlElementSetAttr(mxml_node_t *node, /* I - Element node */
|
||||
const char *name, /* I - Name of attribute */
|
||||
const char *value) /* I - Attribute value */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
mxml_attr_t *attr; /* New attribute */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlElementSetAttr(node=%p, name=\"%s\", value=\"%s\")\n",
|
||||
node, name ? name : "(null)", value ? value : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_ELEMENT || !name)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Look for the attribute...
|
||||
*/
|
||||
|
||||
for (i = node->value.element.num_attrs, attr = node->value.element.attrs;
|
||||
i > 0;
|
||||
i --, attr ++)
|
||||
if (!strcmp(attr->name, name))
|
||||
{
|
||||
/*
|
||||
* Replace the attribute value and return...
|
||||
*/
|
||||
|
||||
if (attr->value)
|
||||
free(attr->value);
|
||||
|
||||
if (value)
|
||||
{
|
||||
if ((attr->value = strdup(value)) == NULL)
|
||||
mxml_error("Unable to allocate memory for attribute '%s' in element %s!",
|
||||
name, node->value.element.name);
|
||||
}
|
||||
else
|
||||
attr->value = NULL;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Attribute not found, so add a new one...
|
||||
*/
|
||||
|
||||
if (node->value.element.num_attrs == 0)
|
||||
attr = malloc(sizeof(mxml_attr_t));
|
||||
else
|
||||
attr = realloc(node->value.element.attrs,
|
||||
(node->value.element.num_attrs + 1) * sizeof(mxml_attr_t));
|
||||
|
||||
if (!attr)
|
||||
{
|
||||
mxml_error("Unable to allocate memory for attribute '%s' in element %s!",
|
||||
name, node->value.element.name);
|
||||
return;
|
||||
}
|
||||
|
||||
node->value.element.attrs = attr;
|
||||
attr += node->value.element.num_attrs;
|
||||
|
||||
attr->name = strdup(name);
|
||||
if (value)
|
||||
attr->value = strdup(value);
|
||||
else
|
||||
attr->value = NULL;
|
||||
|
||||
if (!attr->name || (!attr->value && value))
|
||||
{
|
||||
if (attr->name)
|
||||
free(attr->name);
|
||||
|
||||
if (attr->value)
|
||||
free(attr->value);
|
||||
|
||||
mxml_error("Unable to allocate memory for attribute '%s' in element %s!",
|
||||
name, node->value.element.name);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
node->value.element.num_attrs ++;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
|
@ -0,0 +1,472 @@
|
|||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Character entity support code for Mini-XML, a small XML-like
|
||||
* file parsing library.
|
||||
*
|
||||
* Copyright 2003-2005 by Michael Sweet.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxmlEntityAddCallback() - Add a callback to convert entities to
|
||||
* Unicode.
|
||||
* mxmlEntityGetName() - Get the name that corresponds to the
|
||||
* character value.
|
||||
* mxmlEntityGetValue() - Get the character corresponding to a named
|
||||
* entity.
|
||||
* mxmlEntityRemoveCallback() - Remove a callback.
|
||||
* default_callback() - Lookup standard (X)HTML entities.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mxml.h"
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static int default_callback(const char *name);
|
||||
|
||||
|
||||
/*
|
||||
* Callback array...
|
||||
*/
|
||||
|
||||
static int num_callbacks = 1;
|
||||
static int (*callbacks[100])(const char *name) =
|
||||
{
|
||||
default_callback
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlEntityAddCallback()' - Add a callback to convert entities to Unicode.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlEntityAddCallback(int (*cb)(const char *name))
|
||||
/* I - Callback function to add */
|
||||
{
|
||||
if (num_callbacks < (int)(sizeof(callbacks) / sizeof(callbacks[0])))
|
||||
{
|
||||
callbacks[num_callbacks] = cb;
|
||||
num_callbacks ++;
|
||||
|
||||
return (0);
|
||||
}
|
||||
else
|
||||
{
|
||||
mxml_error("Unable to add entity callback!");
|
||||
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlEntityGetName()' - Get the name that corresponds to the character value.
|
||||
*
|
||||
* If val does not need to be represented by a named entity, NULL is returned.
|
||||
*/
|
||||
|
||||
const char * /* O - Entity name or NULL */
|
||||
mxmlEntityGetName(int val) /* I - Character value */
|
||||
{
|
||||
switch (val)
|
||||
{
|
||||
case '&' :
|
||||
return ("amp");
|
||||
|
||||
case '<' :
|
||||
return ("lt");
|
||||
|
||||
case '>' :
|
||||
return ("gt");
|
||||
|
||||
case '\"' :
|
||||
return ("quot");
|
||||
|
||||
default :
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlEntityGetValue()' - Get the character corresponding to a named entity.
|
||||
*
|
||||
* The entity name can also be a numeric constant. -1 is returned if the
|
||||
* name is not known.
|
||||
*/
|
||||
|
||||
int /* O - Character value or -1 on error */
|
||||
mxmlEntityGetValue(const char *name) /* I - Entity name */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
int ch; /* Character value */
|
||||
|
||||
|
||||
for (i = 0; i < num_callbacks; i ++)
|
||||
if ((ch = (callbacks[i])(name)) >= 0)
|
||||
return (ch);
|
||||
|
||||
return (-1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlEntityRemoveCallback()' - Remove a callback.
|
||||
*/
|
||||
|
||||
void
|
||||
mxmlEntityRemoveCallback(int (*cb)(const char *name))
|
||||
/* I - Callback function to remove */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
|
||||
|
||||
for (i = 0; i < num_callbacks; i ++)
|
||||
if (cb == callbacks[i])
|
||||
{
|
||||
/*
|
||||
* Remove the callback...
|
||||
*/
|
||||
|
||||
num_callbacks --;
|
||||
|
||||
if (i < num_callbacks)
|
||||
memmove(callbacks + i, callbacks + i + 1,
|
||||
(num_callbacks - i) * sizeof(callbacks[0]));
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'default_callback()' - Lookup standard (X)HTML entities.
|
||||
*/
|
||||
|
||||
static int /* O - Unicode value or -1 */
|
||||
default_callback(const char *name) /* I - Entity name */
|
||||
{
|
||||
int diff, /* Difference between names */
|
||||
current, /* Current entity in search */
|
||||
first, /* First entity in search */
|
||||
last; /* Last entity in search */
|
||||
static const struct
|
||||
{
|
||||
const char *name; /* Entity name */
|
||||
int val; /* Character value */
|
||||
} entities[] =
|
||||
{
|
||||
{ "AElig", 198 },
|
||||
{ "Aacute", 193 },
|
||||
{ "Acirc", 194 },
|
||||
{ "Agrave", 192 },
|
||||
{ "Alpha", 913 },
|
||||
{ "Aring", 197 },
|
||||
{ "Atilde", 195 },
|
||||
{ "Auml", 196 },
|
||||
{ "Beta", 914 },
|
||||
{ "Ccedil", 199 },
|
||||
{ "Chi", 935 },
|
||||
{ "Dagger", 8225 },
|
||||
{ "Delta", 916 },
|
||||
{ "Dstrok", 208 },
|
||||
{ "ETH", 208 },
|
||||
{ "Eacute", 201 },
|
||||
{ "Ecirc", 202 },
|
||||
{ "Egrave", 200 },
|
||||
{ "Epsilon", 917 },
|
||||
{ "Eta", 919 },
|
||||
{ "Euml", 203 },
|
||||
{ "Gamma", 915 },
|
||||
{ "Iacute", 205 },
|
||||
{ "Icirc", 206 },
|
||||
{ "Igrave", 204 },
|
||||
{ "Iota", 921 },
|
||||
{ "Iuml", 207 },
|
||||
{ "Kappa", 922 },
|
||||
{ "Lambda", 923 },
|
||||
{ "Mu", 924 },
|
||||
{ "Ntilde", 209 },
|
||||
{ "Nu", 925 },
|
||||
{ "OElig", 338 },
|
||||
{ "Oacute", 211 },
|
||||
{ "Ocirc", 212 },
|
||||
{ "Ograve", 210 },
|
||||
{ "Omega", 937 },
|
||||
{ "Omicron", 927 },
|
||||
{ "Oslash", 216 },
|
||||
{ "Otilde", 213 },
|
||||
{ "Ouml", 214 },
|
||||
{ "Phi", 934 },
|
||||
{ "Pi", 928 },
|
||||
{ "Prime", 8243 },
|
||||
{ "Psi", 936 },
|
||||
{ "Rho", 929 },
|
||||
{ "Scaron", 352 },
|
||||
{ "Sigma", 931 },
|
||||
{ "THORN", 222 },
|
||||
{ "Tau", 932 },
|
||||
{ "Theta", 920 },
|
||||
{ "Uacute", 218 },
|
||||
{ "Ucirc", 219 },
|
||||
{ "Ugrave", 217 },
|
||||
{ "Upsilon", 933 },
|
||||
{ "Uuml", 220 },
|
||||
{ "Xi", 926 },
|
||||
{ "Yacute", 221 },
|
||||
{ "Yuml", 376 },
|
||||
{ "Zeta", 918 },
|
||||
{ "aacute", 225 },
|
||||
{ "acirc", 226 },
|
||||
{ "acute", 180 },
|
||||
{ "aelig", 230 },
|
||||
{ "agrave", 224 },
|
||||
{ "alefsym", 8501 },
|
||||
{ "alpha", 945 },
|
||||
{ "amp", '&' },
|
||||
{ "and", 8743 },
|
||||
{ "ang", 8736 },
|
||||
{ "aring", 229 },
|
||||
{ "asymp", 8776 },
|
||||
{ "atilde", 227 },
|
||||
{ "auml", 228 },
|
||||
{ "bdquo", 8222 },
|
||||
{ "beta", 946 },
|
||||
{ "brkbar", 166 },
|
||||
{ "brvbar", 166 },
|
||||
{ "bull", 8226 },
|
||||
{ "cap", 8745 },
|
||||
{ "ccedil", 231 },
|
||||
{ "cedil", 184 },
|
||||
{ "cent", 162 },
|
||||
{ "chi", 967 },
|
||||
{ "circ", 710 },
|
||||
{ "clubs", 9827 },
|
||||
{ "cong", 8773 },
|
||||
{ "copy", 169 },
|
||||
{ "crarr", 8629 },
|
||||
{ "cup", 8746 },
|
||||
{ "curren", 164 },
|
||||
{ "dArr", 8659 },
|
||||
{ "dagger", 8224 },
|
||||
{ "darr", 8595 },
|
||||
{ "deg", 176 },
|
||||
{ "delta", 948 },
|
||||
{ "diams", 9830 },
|
||||
{ "die", 168 },
|
||||
{ "divide", 247 },
|
||||
{ "eacute", 233 },
|
||||
{ "ecirc", 234 },
|
||||
{ "egrave", 232 },
|
||||
{ "empty", 8709 },
|
||||
{ "emsp", 8195 },
|
||||
{ "ensp", 8194 },
|
||||
{ "epsilon", 949 },
|
||||
{ "equiv", 8801 },
|
||||
{ "eta", 951 },
|
||||
{ "eth", 240 },
|
||||
{ "euml", 235 },
|
||||
{ "euro", 8364 },
|
||||
{ "exist", 8707 },
|
||||
{ "fnof", 402 },
|
||||
{ "forall", 8704 },
|
||||
{ "frac12", 189 },
|
||||
{ "frac14", 188 },
|
||||
{ "frac34", 190 },
|
||||
{ "frasl", 8260 },
|
||||
{ "gamma", 947 },
|
||||
{ "ge", 8805 },
|
||||
{ "gt", '>' },
|
||||
{ "hArr", 8660 },
|
||||
{ "harr", 8596 },
|
||||
{ "hearts", 9829 },
|
||||
{ "hellip", 8230 },
|
||||
{ "hibar", 175 },
|
||||
{ "iacute", 237 },
|
||||
{ "icirc", 238 },
|
||||
{ "iexcl", 161 },
|
||||
{ "igrave", 236 },
|
||||
{ "image", 8465 },
|
||||
{ "infin", 8734 },
|
||||
{ "int", 8747 },
|
||||
{ "iota", 953 },
|
||||
{ "iquest", 191 },
|
||||
{ "isin", 8712 },
|
||||
{ "iuml", 239 },
|
||||
{ "kappa", 954 },
|
||||
{ "lArr", 8656 },
|
||||
{ "lambda", 955 },
|
||||
{ "lang", 9001 },
|
||||
{ "laquo", 171 },
|
||||
{ "larr", 8592 },
|
||||
{ "lceil", 8968 },
|
||||
{ "ldquo", 8220 },
|
||||
{ "le", 8804 },
|
||||
{ "lfloor", 8970 },
|
||||
{ "lowast", 8727 },
|
||||
{ "loz", 9674 },
|
||||
{ "lrm", 8206 },
|
||||
{ "lsaquo", 8249 },
|
||||
{ "lsquo", 8216 },
|
||||
{ "lt", '<' },
|
||||
{ "macr", 175 },
|
||||
{ "mdash", 8212 },
|
||||
{ "micro", 181 },
|
||||
{ "middot", 183 },
|
||||
{ "minus", 8722 },
|
||||
{ "mu", 956 },
|
||||
{ "nabla", 8711 },
|
||||
{ "nbsp", 160 },
|
||||
{ "ndash", 8211 },
|
||||
{ "ne", 8800 },
|
||||
{ "ni", 8715 },
|
||||
{ "not", 172 },
|
||||
{ "notin", 8713 },
|
||||
{ "nsub", 8836 },
|
||||
{ "ntilde", 241 },
|
||||
{ "nu", 957 },
|
||||
{ "oacute", 243 },
|
||||
{ "ocirc", 244 },
|
||||
{ "oelig", 339 },
|
||||
{ "ograve", 242 },
|
||||
{ "oline", 8254 },
|
||||
{ "omega", 969 },
|
||||
{ "omicron", 959 },
|
||||
{ "oplus", 8853 },
|
||||
{ "or", 8744 },
|
||||
{ "ordf", 170 },
|
||||
{ "ordm", 186 },
|
||||
{ "oslash", 248 },
|
||||
{ "otilde", 245 },
|
||||
{ "otimes", 8855 },
|
||||
{ "ouml", 246 },
|
||||
{ "para", 182 },
|
||||
{ "part", 8706 },
|
||||
{ "permil", 8240 },
|
||||
{ "perp", 8869 },
|
||||
{ "phi", 966 },
|
||||
{ "pi", 960 },
|
||||
{ "piv", 982 },
|
||||
{ "plusmn", 177 },
|
||||
{ "pound", 163 },
|
||||
{ "prime", 8242 },
|
||||
{ "prod", 8719 },
|
||||
{ "prop", 8733 },
|
||||
{ "psi", 968 },
|
||||
{ "quot", '\"' },
|
||||
{ "rArr", 8658 },
|
||||
{ "radic", 8730 },
|
||||
{ "rang", 9002 },
|
||||
{ "raquo", 187 },
|
||||
{ "rarr", 8594 },
|
||||
{ "rceil", 8969 },
|
||||
{ "rdquo", 8221 },
|
||||
{ "real", 8476 },
|
||||
{ "reg", 174 },
|
||||
{ "rfloor", 8971 },
|
||||
{ "rho", 961 },
|
||||
{ "rlm", 8207 },
|
||||
{ "rsaquo", 8250 },
|
||||
{ "rsquo", 8217 },
|
||||
{ "sbquo", 8218 },
|
||||
{ "scaron", 353 },
|
||||
{ "sdot", 8901 },
|
||||
{ "sect", 167 },
|
||||
{ "shy", 173 },
|
||||
{ "sigma", 963 },
|
||||
{ "sigmaf", 962 },
|
||||
{ "sim", 8764 },
|
||||
{ "spades", 9824 },
|
||||
{ "sub", 8834 },
|
||||
{ "sube", 8838 },
|
||||
{ "sum", 8721 },
|
||||
{ "sup", 8835 },
|
||||
{ "sup1", 185 },
|
||||
{ "sup2", 178 },
|
||||
{ "sup3", 179 },
|
||||
{ "supe", 8839 },
|
||||
{ "szlig", 223 },
|
||||
{ "tau", 964 },
|
||||
{ "there4", 8756 },
|
||||
{ "theta", 952 },
|
||||
{ "thetasym", 977 },
|
||||
{ "thinsp", 8201 },
|
||||
{ "thorn", 254 },
|
||||
{ "tilde", 732 },
|
||||
{ "times", 215 },
|
||||
{ "trade", 8482 },
|
||||
{ "uArr", 8657 },
|
||||
{ "uacute", 250 },
|
||||
{ "uarr", 8593 },
|
||||
{ "ucirc", 251 },
|
||||
{ "ugrave", 249 },
|
||||
{ "uml", 168 },
|
||||
{ "upsih", 978 },
|
||||
{ "upsilon", 965 },
|
||||
{ "uuml", 252 },
|
||||
{ "weierp", 8472 },
|
||||
{ "xi", 958 },
|
||||
{ "yacute", 253 },
|
||||
{ "yen", 165 },
|
||||
{ "yuml", 255 },
|
||||
{ "zeta", 950 },
|
||||
{ "zwj", 8205 },
|
||||
{ "zwnj", 8204 }
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Do a binary search for the named entity...
|
||||
*/
|
||||
|
||||
first = 0;
|
||||
last = (int)(sizeof(entities) / sizeof(entities[0]) - 1);
|
||||
|
||||
while ((last - first) > 1)
|
||||
{
|
||||
current = (first + last) / 2;
|
||||
|
||||
if ((diff = strcmp(name, entities[current].name)) == 0)
|
||||
return (entities[current].val);
|
||||
else if (diff < 0)
|
||||
last = current;
|
||||
else
|
||||
first = current;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we get here, there is a small chance that there is still
|
||||
* a match; check first and last...
|
||||
*/
|
||||
|
||||
if (!strcmp(name, entities[first].name))
|
||||
return (entities[first].val);
|
||||
else if (!strcmp(name, entities[last].name))
|
||||
return (entities[last].val);
|
||||
else
|
||||
return (-1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,649 @@
|
|||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Index support code for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2005 by Michael Sweet.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxmlIndexDelete() - Delete an index.
|
||||
* mxmlIndexEnum() - Return the next node in the index.
|
||||
* mxmlIndexFind() - Find the next matching node.
|
||||
* mxmlIndexNew() - Create a new index.
|
||||
* mxmlIndexReset() - Reset the enumeration/find pointer in the index and
|
||||
* return the first node in the index.
|
||||
* index_compare() - Compare two nodes.
|
||||
* index_find() - Compare a node with index values.
|
||||
* index_sort() - Sort the nodes in the index...
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mxml.h"
|
||||
|
||||
|
||||
/*
|
||||
* Sort functions...
|
||||
*/
|
||||
|
||||
static int index_compare(mxml_index_t *ind, mxml_node_t *first,
|
||||
mxml_node_t *second);
|
||||
static int index_find(mxml_index_t *ind, const char *element,
|
||||
const char *value, mxml_node_t *node);
|
||||
static void index_sort(mxml_index_t *ind, int left, int right);
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlIndexDelete()' - Delete an index.
|
||||
*/
|
||||
|
||||
void
|
||||
mxmlIndexDelete(mxml_index_t *ind) /* I - Index to delete */
|
||||
{
|
||||
/*
|
||||
* Range check input..
|
||||
*/
|
||||
|
||||
if (!ind)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Free memory...
|
||||
*/
|
||||
|
||||
if (ind->attr)
|
||||
free(ind->attr);
|
||||
|
||||
if (ind->alloc_nodes)
|
||||
free(ind->nodes);
|
||||
|
||||
free(ind);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlIndexEnum()' - Return the next node in the index.
|
||||
*
|
||||
* Nodes are returned in the sorted order of the index.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - Next node or NULL if there is none */
|
||||
mxmlIndexEnum(mxml_index_t *ind) /* I - Index to enumerate */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!ind)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Return the next node...
|
||||
*/
|
||||
|
||||
if (ind->cur_node < ind->num_nodes)
|
||||
return (ind->nodes[ind->cur_node ++]);
|
||||
else
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlIndexFind()' - Find the next matching node.
|
||||
*
|
||||
* You should call mxmlIndexReset() prior to using this function for
|
||||
* the first time with a particular set of "element" and "value"
|
||||
* strings. Passing NULL for both "element" and "value" is equivalent
|
||||
* to calling mxmlIndexEnum().
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - Node or NULL if none found */
|
||||
mxmlIndexFind(mxml_index_t *ind, /* I - Index to search */
|
||||
const char *element, /* I - Element name to find, if any */
|
||||
const char *value) /* I - Attribute value, if any */
|
||||
{
|
||||
int diff, /* Difference between names */
|
||||
current, /* Current entity in search */
|
||||
first, /* First entity in search */
|
||||
last; /* Last entity in search */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("mxmlIndexFind(ind=%p, element=\"%s\", value=\"%s\")\n",
|
||||
ind, element ? element : "(null)", value ? value : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!ind || (!ind->attr && value))
|
||||
{
|
||||
#ifdef DEBUG
|
||||
puts(" returning NULL...");
|
||||
printf(" ind->attr=\"%s\"\n", ind->attr ? ind->attr : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* If both element and value are NULL, just enumerate the nodes in the
|
||||
* index...
|
||||
*/
|
||||
|
||||
if (!element && !value)
|
||||
return (mxmlIndexEnum(ind));
|
||||
|
||||
/*
|
||||
* If there are no nodes in the index, return NULL...
|
||||
*/
|
||||
|
||||
if (!ind->num_nodes)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
puts(" returning NULL...");
|
||||
puts(" no nodes!");
|
||||
#endif /* DEBUG */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* If cur_node == 0, then find the first matching node...
|
||||
*/
|
||||
|
||||
if (ind->cur_node == 0)
|
||||
{
|
||||
/*
|
||||
* Find the first node using a modified binary search algorithm...
|
||||
*/
|
||||
|
||||
first = 0;
|
||||
last = ind->num_nodes - 1;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf(" find first time, num_nodes=%d...\n", ind->num_nodes);
|
||||
#endif /* DEBUG */
|
||||
|
||||
while ((last - first) > 1)
|
||||
{
|
||||
current = (first + last) / 2;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf(" first=%d, last=%d, current=%d\n", first, last, current);
|
||||
#endif /* DEBUG */
|
||||
|
||||
if ((diff = index_find(ind, element, value, ind->nodes[current])) == 0)
|
||||
{
|
||||
/*
|
||||
* Found a match, move back to find the first...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
puts(" match!");
|
||||
#endif /* DEBUG */
|
||||
|
||||
while (current > 0 &&
|
||||
!index_find(ind, element, value, ind->nodes[current - 1]))
|
||||
current --;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf(" returning first match=%d\n", current);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Return the first match and save the index to the next...
|
||||
*/
|
||||
|
||||
ind->cur_node = current + 1;
|
||||
|
||||
return (ind->nodes[current]);
|
||||
}
|
||||
else if (diff < 0)
|
||||
last = current;
|
||||
else
|
||||
first = current;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf(" diff=%d\n", diff);
|
||||
#endif /* DEBUG */
|
||||
}
|
||||
|
||||
/*
|
||||
* If we get this far, then we found exactly 0 or 1 matches...
|
||||
*/
|
||||
|
||||
for (current = first; current <= last; current ++)
|
||||
if (!index_find(ind, element, value, ind->nodes[current]))
|
||||
{
|
||||
/*
|
||||
* Found exactly one (or possibly two) match...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
printf(" returning only match %d...\n", current);
|
||||
#endif /* DEBUG */
|
||||
|
||||
ind->cur_node = current + 1;
|
||||
|
||||
return (ind->nodes[current]);
|
||||
}
|
||||
|
||||
/*
|
||||
* No matches...
|
||||
*/
|
||||
|
||||
ind->cur_node = ind->num_nodes;
|
||||
|
||||
#ifdef DEBUG
|
||||
puts(" returning NULL...");
|
||||
#endif /* DEBUG */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
else if (ind->cur_node < ind->num_nodes &&
|
||||
!index_find(ind, element, value, ind->nodes[ind->cur_node]))
|
||||
{
|
||||
/*
|
||||
* Return the next matching node...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
printf(" returning next match %d...\n", ind->cur_node);
|
||||
#endif /* DEBUG */
|
||||
|
||||
return (ind->nodes[ind->cur_node ++]);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we get this far, then we have no matches...
|
||||
*/
|
||||
|
||||
ind->cur_node = ind->num_nodes;
|
||||
|
||||
#ifdef DEBUG
|
||||
puts(" returning NULL...");
|
||||
#endif /* DEBUG */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlIndexNew()' - Create a new index.
|
||||
*
|
||||
* The index will contain all nodes that contain the named element and/or
|
||||
* attribute. If both "element" and "attr" are NULL, then the index will
|
||||
* contain a sorted list of the elements in the node tree. Nodes are
|
||||
* sorted by element name and optionally by attribute value if the "attr"
|
||||
* argument is not NULL.
|
||||
*/
|
||||
|
||||
mxml_index_t * /* O - New index */
|
||||
mxmlIndexNew(mxml_node_t *node, /* I - XML node tree */
|
||||
const char *element, /* I - Element to index or NULL for all */
|
||||
const char *attr) /* I - Attribute to index or NULL for none */
|
||||
{
|
||||
mxml_index_t *ind; /* New index */
|
||||
mxml_node_t *current, /* Current node in index */
|
||||
**temp; /* Temporary node pointer array */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("mxmlIndexNew(node=%p, element=\"%s\", attr=\"%s\")\n",
|
||||
node, element ? element : "(null)", attr ? attr : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (!node)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Create a new index...
|
||||
*/
|
||||
|
||||
if ((ind = calloc(1, sizeof(mxml_index_t))) == NULL)
|
||||
{
|
||||
mxml_error("Unable to allocate %d bytes for index - %s",
|
||||
sizeof(mxml_index_t), strerror(errno));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (attr)
|
||||
ind->attr = strdup(attr);
|
||||
|
||||
if (!element && !attr)
|
||||
current = node;
|
||||
else
|
||||
current = mxmlFindElement(node, node, element, attr, NULL, MXML_DESCEND);
|
||||
|
||||
while (current)
|
||||
{
|
||||
if (ind->num_nodes >= ind->alloc_nodes)
|
||||
{
|
||||
if (!ind->alloc_nodes)
|
||||
temp = malloc(64 * sizeof(mxml_node_t *));
|
||||
else
|
||||
temp = realloc(ind->nodes, (ind->alloc_nodes + 64) * sizeof(mxml_node_t *));
|
||||
|
||||
if (!temp)
|
||||
{
|
||||
/*
|
||||
* Unable to allocate memory for the index, so abort...
|
||||
*/
|
||||
|
||||
mxml_error("Unable to allocate %d bytes for index: %s",
|
||||
(ind->alloc_nodes + 64) * sizeof(mxml_node_t *),
|
||||
strerror(errno));
|
||||
|
||||
mxmlIndexDelete(ind);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
ind->nodes = temp;
|
||||
ind->alloc_nodes += 64;
|
||||
}
|
||||
|
||||
ind->nodes[ind->num_nodes ++] = current;
|
||||
|
||||
current = mxmlFindElement(current, node, element, attr, NULL, MXML_DESCEND);
|
||||
}
|
||||
|
||||
/*
|
||||
* Sort nodes based upon the search criteria...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
{
|
||||
int i; /* Looping var */
|
||||
|
||||
|
||||
printf("%d node(s) in index.\n\n", ind->num_nodes);
|
||||
|
||||
if (attr)
|
||||
{
|
||||
printf("Node Address Element %s\n", attr);
|
||||
puts("-------- -------- -------------- ------------------------------");
|
||||
|
||||
for (i = 0; i < ind->num_nodes; i ++)
|
||||
printf("%8d %-8p %-14.14s %s\n", i, ind->nodes[i],
|
||||
ind->nodes[i]->value.element.name,
|
||||
mxmlElementGetAttr(ind->nodes[i], attr));
|
||||
}
|
||||
else
|
||||
{
|
||||
puts("Node Address Element");
|
||||
puts("-------- -------- --------------");
|
||||
|
||||
for (i = 0; i < ind->num_nodes; i ++)
|
||||
printf("%8d %-8p %s\n", i, ind->nodes[i],
|
||||
ind->nodes[i]->value.element.name);
|
||||
}
|
||||
|
||||
putchar('\n');
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (ind->num_nodes > 1)
|
||||
index_sort(ind, 0, ind->num_nodes - 1);
|
||||
|
||||
#ifdef DEBUG
|
||||
{
|
||||
int i; /* Looping var */
|
||||
|
||||
|
||||
puts("After sorting:\n");
|
||||
|
||||
if (attr)
|
||||
{
|
||||
printf("Node Address Element %s\n", attr);
|
||||
puts("-------- -------- -------------- ------------------------------");
|
||||
|
||||
for (i = 0; i < ind->num_nodes; i ++)
|
||||
printf("%8d %-8p %-14.14s %s\n", i, ind->nodes[i],
|
||||
ind->nodes[i]->value.element.name,
|
||||
mxmlElementGetAttr(ind->nodes[i], attr));
|
||||
}
|
||||
else
|
||||
{
|
||||
puts("Node Address Element");
|
||||
puts("-------- -------- --------------");
|
||||
|
||||
for (i = 0; i < ind->num_nodes; i ++)
|
||||
printf("%8d %-8p %s\n", i, ind->nodes[i],
|
||||
ind->nodes[i]->value.element.name);
|
||||
}
|
||||
|
||||
putchar('\n');
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Return the new index...
|
||||
*/
|
||||
|
||||
return (ind);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlIndexReset()' - Reset the enumeration/find pointer in the index and
|
||||
* return the first node in the index.
|
||||
*
|
||||
* This function should be called prior to using mxmlIndexEnum() or
|
||||
* mxmlIndexFind() for the first time.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - First node or NULL if there is none */
|
||||
mxmlIndexReset(mxml_index_t *ind) /* I - Index to reset */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("mxmlIndexReset(ind=%p)\n", ind);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!ind)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Set the index to the first element...
|
||||
*/
|
||||
|
||||
ind->cur_node = 0;
|
||||
|
||||
/*
|
||||
* Return the first node...
|
||||
*/
|
||||
|
||||
if (ind->num_nodes)
|
||||
return (ind->nodes[0]);
|
||||
else
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'index_compare()' - Compare two nodes.
|
||||
*/
|
||||
|
||||
static int /* O - Result of comparison */
|
||||
index_compare(mxml_index_t *ind, /* I - Index */
|
||||
mxml_node_t *first, /* I - First node */
|
||||
mxml_node_t *second) /* I - Second node */
|
||||
{
|
||||
int diff; /* Difference */
|
||||
|
||||
|
||||
/*
|
||||
* Check the element name...
|
||||
*/
|
||||
|
||||
if ((diff = strcmp(first->value.element.name,
|
||||
second->value.element.name)) != 0)
|
||||
return (diff);
|
||||
|
||||
/*
|
||||
* Check the attribute value...
|
||||
*/
|
||||
|
||||
if (ind->attr)
|
||||
{
|
||||
if ((diff = strcmp(mxmlElementGetAttr(first, ind->attr),
|
||||
mxmlElementGetAttr(second, ind->attr))) != 0)
|
||||
return (diff);
|
||||
}
|
||||
|
||||
/*
|
||||
* No difference, return 0...
|
||||
*/
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'index_find()' - Compare a node with index values.
|
||||
*/
|
||||
|
||||
static int /* O - Result of comparison */
|
||||
index_find(mxml_index_t *ind, /* I - Index */
|
||||
const char *element, /* I - Element name or NULL */
|
||||
const char *value, /* I - Attribute value or NULL */
|
||||
mxml_node_t *node) /* I - Node */
|
||||
{
|
||||
int diff; /* Difference */
|
||||
|
||||
|
||||
/*
|
||||
* Check the element name...
|
||||
*/
|
||||
|
||||
if (element)
|
||||
{
|
||||
if ((diff = strcmp(element, node->value.element.name)) != 0)
|
||||
return (diff);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check the attribute value...
|
||||
*/
|
||||
|
||||
if (value)
|
||||
{
|
||||
if ((diff = strcmp(value, mxmlElementGetAttr(node, ind->attr))) != 0)
|
||||
return (diff);
|
||||
}
|
||||
|
||||
/*
|
||||
* No difference, return 0...
|
||||
*/
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'index_sort()' - Sort the nodes in the index...
|
||||
*
|
||||
* This function implements the classic quicksort algorithm...
|
||||
*/
|
||||
|
||||
static void
|
||||
index_sort(mxml_index_t *ind, /* I - Index to sort */
|
||||
int left, /* I - Left node in partition */
|
||||
int right) /* I - Right node in partition */
|
||||
{
|
||||
mxml_node_t *pivot, /* Pivot node */
|
||||
*temp; /* Swap node */
|
||||
int templ, /* Temporary left node */
|
||||
tempr; /* Temporary right node */
|
||||
|
||||
|
||||
/*
|
||||
* Loop until we have sorted all the way to the right...
|
||||
*/
|
||||
|
||||
do
|
||||
{
|
||||
/*
|
||||
* Sort the pivot in the current partition...
|
||||
*/
|
||||
|
||||
pivot = ind->nodes[left];
|
||||
|
||||
for (templ = left, tempr = right; templ < tempr;)
|
||||
{
|
||||
/*
|
||||
* Move left while left node <= pivot node...
|
||||
*/
|
||||
|
||||
while ((templ < right) &&
|
||||
index_compare(ind, ind->nodes[templ], pivot) <= 0)
|
||||
templ ++;
|
||||
|
||||
/*
|
||||
* Move right while right node > pivot node...
|
||||
*/
|
||||
|
||||
while ((tempr > left) &&
|
||||
index_compare(ind, ind->nodes[tempr], pivot) > 0)
|
||||
tempr --;
|
||||
|
||||
/*
|
||||
* Swap nodes if needed...
|
||||
*/
|
||||
|
||||
if (templ < tempr)
|
||||
{
|
||||
temp = ind->nodes[templ];
|
||||
ind->nodes[templ] = ind->nodes[tempr];
|
||||
ind->nodes[tempr] = temp;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* When we get here, the right (tempr) node is the new position for the
|
||||
* pivot node...
|
||||
*/
|
||||
|
||||
if (index_compare(ind, pivot, ind->nodes[tempr]) > 0)
|
||||
{
|
||||
ind->nodes[left] = ind->nodes[tempr];
|
||||
ind->nodes[tempr] = pivot;
|
||||
}
|
||||
|
||||
/*
|
||||
* Recursively sort the left partition as needed...
|
||||
*/
|
||||
|
||||
if (left < (tempr - 1))
|
||||
index_sort(ind, left, tempr - 1);
|
||||
}
|
||||
while (right > (left = tempr + 1));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
|
@ -0,0 +1,664 @@
|
|||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Node support code for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2005 by Michael Sweet.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxmlAdd() - Add a node to a tree.
|
||||
* mxmlDelete() - Delete a node and all of its children.
|
||||
* mxmlNewElement() - Create a new element node.
|
||||
* mxmlNewInteger() - Create a new integer node.
|
||||
* mxmlNewOpaque() - Create a new opaque string.
|
||||
* mxmlNewReal() - Create a new real number node.
|
||||
* mxmlNewText() - Create a new text fragment node.
|
||||
* mxmlNewTextf() - Create a new formatted text fragment node.
|
||||
* mxmlRemove() - Remove a node from its parent.
|
||||
* mxml_new() - Create a new node.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mxml.h"
|
||||
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
static mxml_node_t *mxml_new(mxml_node_t *parent, mxml_type_t type);
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlAdd()' - Add a node to a tree.
|
||||
*
|
||||
* Adds the specified node to the parent. If the child argument is not
|
||||
* NULL, puts the new node before or after the specified child depending
|
||||
* on the value of the where argument. If the child argument is NULL,
|
||||
* puts the new node at the beginning of the child list (MXML_ADD_BEFORE)
|
||||
* or at the end of the child list (MXML_ADD_AFTER). The constant
|
||||
* MXML_ADD_TO_PARENT can be used to specify a NULL child pointer.
|
||||
*/
|
||||
|
||||
void
|
||||
mxmlAdd(mxml_node_t *parent, /* I - Parent node */
|
||||
int where, /* I - Where to add, MXML_ADD_BEFORE or MXML_ADD_AFTER */
|
||||
mxml_node_t *child, /* I - Child node for where or MXML_ADD_TO_PARENT */
|
||||
mxml_node_t *node) /* I - Node to add */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlAdd(parent=%p, where=%d, child=%p, node=%p)\n", parent,
|
||||
where, child, node);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!parent || !node)
|
||||
return;
|
||||
|
||||
#if DEBUG > 1
|
||||
fprintf(stderr, " BEFORE: node->parent=%p\n", node->parent);
|
||||
if (parent)
|
||||
{
|
||||
fprintf(stderr, " BEFORE: parent->child=%p\n", parent->child);
|
||||
fprintf(stderr, " BEFORE: parent->last_child=%p\n", parent->last_child);
|
||||
fprintf(stderr, " BEFORE: parent->prev=%p\n", parent->prev);
|
||||
fprintf(stderr, " BEFORE: parent->next=%p\n", parent->next);
|
||||
}
|
||||
#endif /* DEBUG > 1 */
|
||||
|
||||
/*
|
||||
* Remove the node from any existing parent...
|
||||
*/
|
||||
|
||||
if (node->parent)
|
||||
mxmlRemove(node);
|
||||
|
||||
/*
|
||||
* Reset pointers...
|
||||
*/
|
||||
|
||||
node->parent = parent;
|
||||
|
||||
switch (where)
|
||||
{
|
||||
case MXML_ADD_BEFORE :
|
||||
if (!child || child == parent->child || child->parent != parent)
|
||||
{
|
||||
/*
|
||||
* Insert as first node under parent...
|
||||
*/
|
||||
|
||||
node->next = parent->child;
|
||||
|
||||
if (parent->child)
|
||||
parent->child->prev = node;
|
||||
else
|
||||
parent->last_child = node;
|
||||
|
||||
parent->child = node;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Insert node before this child...
|
||||
*/
|
||||
|
||||
node->next = child;
|
||||
node->prev = child->prev;
|
||||
|
||||
if (child->prev)
|
||||
child->prev->next = node;
|
||||
else
|
||||
parent->child = node;
|
||||
|
||||
child->prev = node;
|
||||
}
|
||||
break;
|
||||
|
||||
case MXML_ADD_AFTER :
|
||||
if (!child || child == parent->last_child || child->parent != parent)
|
||||
{
|
||||
/*
|
||||
* Insert as last node under parent...
|
||||
*/
|
||||
|
||||
node->parent = parent;
|
||||
node->prev = parent->last_child;
|
||||
|
||||
if (parent->last_child)
|
||||
parent->last_child->next = node;
|
||||
else
|
||||
parent->child = node;
|
||||
|
||||
parent->last_child = node;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Insert node after this child...
|
||||
*/
|
||||
|
||||
node->prev = child;
|
||||
node->next = child->next;
|
||||
|
||||
if (child->next)
|
||||
child->next->prev = node;
|
||||
else
|
||||
parent->last_child = node;
|
||||
|
||||
child->next = node;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
#if DEBUG > 1
|
||||
fprintf(stderr, " AFTER: node->parent=%p\n", node->parent);
|
||||
if (parent)
|
||||
{
|
||||
fprintf(stderr, " AFTER: parent->child=%p\n", parent->child);
|
||||
fprintf(stderr, " AFTER: parent->last_child=%p\n", parent->last_child);
|
||||
fprintf(stderr, " AFTER: parent->prev=%p\n", parent->prev);
|
||||
fprintf(stderr, " AFTER: parent->next=%p\n", parent->next);
|
||||
}
|
||||
#endif /* DEBUG > 1 */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlDelete()' - Delete a node and all of its children.
|
||||
*
|
||||
* If the specified node has a parent, this function first removes the
|
||||
* node from its parent using the mxmlRemove() function.
|
||||
*/
|
||||
|
||||
void
|
||||
mxmlDelete(mxml_node_t *node) /* I - Node to delete */
|
||||
{
|
||||
int i; /* Looping var */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlDelete(node=%p)\n", node);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Remove the node from its parent, if any...
|
||||
*/
|
||||
|
||||
mxmlRemove(node);
|
||||
|
||||
/*
|
||||
* Delete children...
|
||||
*/
|
||||
|
||||
while (node->child)
|
||||
mxmlDelete(node->child);
|
||||
|
||||
/*
|
||||
* Now delete any node data...
|
||||
*/
|
||||
|
||||
switch (node->type)
|
||||
{
|
||||
case MXML_ELEMENT :
|
||||
if (node->value.element.name)
|
||||
free(node->value.element.name);
|
||||
|
||||
if (node->value.element.num_attrs)
|
||||
{
|
||||
for (i = 0; i < node->value.element.num_attrs; i ++)
|
||||
{
|
||||
if (node->value.element.attrs[i].name)
|
||||
free(node->value.element.attrs[i].name);
|
||||
if (node->value.element.attrs[i].value)
|
||||
free(node->value.element.attrs[i].value);
|
||||
}
|
||||
|
||||
free(node->value.element.attrs);
|
||||
}
|
||||
break;
|
||||
case MXML_INTEGER :
|
||||
/* Nothing to do */
|
||||
break;
|
||||
case MXML_OPAQUE :
|
||||
if (node->value.opaque)
|
||||
free(node->value.opaque);
|
||||
break;
|
||||
case MXML_REAL :
|
||||
/* Nothing to do */
|
||||
break;
|
||||
case MXML_TEXT :
|
||||
if (node->value.text.string)
|
||||
free(node->value.text.string);
|
||||
break;
|
||||
case MXML_CUSTOM :
|
||||
if (node->value.custom.data &&
|
||||
node->value.custom.destroy)
|
||||
(*(node->value.custom.destroy))(node->value.custom.data);
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Free this node...
|
||||
*/
|
||||
|
||||
free(node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewCustom()' - Create a new custom data node.
|
||||
*
|
||||
* The new custom node is added to the end of the specified parent's child
|
||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
* element node has no parent. NULL can be passed when the data in the
|
||||
* node is not dynamically allocated or is separately managed.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewCustom(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
void *data, /* I - Pointer to data */
|
||||
void (*destroy)(void *))
|
||||
/* I - Function to destroy data */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewCustom(parent=%p, data=%p, destroy=%p)\n", parent,
|
||||
data, destroy);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Create the node and set the value...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_CUSTOM)) != NULL)
|
||||
{
|
||||
node->value.custom.data = data;
|
||||
node->value.custom.destroy = destroy;
|
||||
}
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewElement()' - Create a new element node.
|
||||
*
|
||||
* The new element node is added to the end of the specified parent's child
|
||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
* element node has no parent.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewElement(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
const char *name) /* I - Name of element */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewElement(parent=%p, name=\"%s\")\n", parent,
|
||||
name ? name : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!name)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Create the node and set the element name...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_ELEMENT)) != NULL)
|
||||
node->value.element.name = strdup(name);
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewInteger()' - Create a new integer node.
|
||||
*
|
||||
* The new integer node is added to the end of the specified parent's child
|
||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
* integer node has no parent.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewInteger(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
int integer) /* I - Integer value */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewInteger(parent=%p, integer=%d)\n", parent, integer);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Create the node and set the element name...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_INTEGER)) != NULL)
|
||||
node->value.integer = integer;
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewOpaque()' - Create a new opaque string.
|
||||
*
|
||||
* The new opaque node is added to the end of the specified parent's child
|
||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
* opaque node has no parent. The opaque string must be nul-terminated and
|
||||
* is copied into the new node.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewOpaque(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
const char *opaque) /* I - Opaque string */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewOpaque(parent=%p, opaque=\"%s\")\n", parent,
|
||||
opaque ? opaque : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!opaque)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Create the node and set the element name...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_OPAQUE)) != NULL)
|
||||
node->value.opaque = strdup(opaque);
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewReal()' - Create a new real number node.
|
||||
*
|
||||
* The new real number node is added to the end of the specified parent's
|
||||
* child list. The constant MXML_NO_PARENT can be used to specify that
|
||||
* the new real number node has no parent.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewReal(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
double real) /* I - Real number value */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewReal(parent=%p, real=%g)\n", parent, real);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Create the node and set the element name...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_REAL)) != NULL)
|
||||
node->value.real = real;
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewText()' - Create a new text fragment node.
|
||||
*
|
||||
* The new text node is added to the end of the specified parent's child
|
||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
* text node has no parent. The whitespace parameter is used to specify
|
||||
* whether leading whitespace is present before the node. The text
|
||||
* string must be nul-terminated and is copied into the new node.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewText(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */
|
||||
const char *string) /* I - String */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewText(parent=%p, whitespace=%d, string=\"%s\")\n",
|
||||
parent, whitespace, string ? string : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!string)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Create the node and set the text value...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_TEXT)) != NULL)
|
||||
{
|
||||
node->value.text.whitespace = whitespace;
|
||||
node->value.text.string = strdup(string);
|
||||
}
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlNewTextf()' - Create a new formatted text fragment node.
|
||||
*
|
||||
* The new text node is added to the end of the specified parent's child
|
||||
* list. The constant MXML_NO_PARENT can be used to specify that the new
|
||||
* text node has no parent. The whitespace parameter is used to specify
|
||||
* whether leading whitespace is present before the node. The format
|
||||
* string must be nul-terminated and is formatted into the new node.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - New node */
|
||||
mxmlNewTextf(mxml_node_t *parent, /* I - Parent node or MXML_NO_PARENT */
|
||||
int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */
|
||||
const char *format, /* I - Printf-style frmat string */
|
||||
...) /* I - Additional args as needed */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
va_list ap; /* Pointer to arguments */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlNewTextf(parent=%p, whitespace=%d, format=\"%s\", ...)\n",
|
||||
parent, whitespace, format ? format : "(null)");
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!format)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Create the node and set the text value...
|
||||
*/
|
||||
|
||||
if ((node = mxml_new(parent, MXML_TEXT)) != NULL)
|
||||
{
|
||||
va_start(ap, format);
|
||||
|
||||
node->value.text.whitespace = whitespace;
|
||||
node->value.text.string = mxml_strdupf(format, ap);
|
||||
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlRemove()' - Remove a node from its parent.
|
||||
*
|
||||
* Does not free memory used by the node - use mxmlDelete() for that.
|
||||
* This function does nothing if the node has no parent.
|
||||
*/
|
||||
|
||||
void
|
||||
mxmlRemove(mxml_node_t *node) /* I - Node to remove */
|
||||
{
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "mxmlRemove(node=%p)\n", node);
|
||||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || !node->parent)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Remove from parent...
|
||||
*/
|
||||
|
||||
#if DEBUG > 1
|
||||
fprintf(stderr, " BEFORE: node->parent=%p\n", node->parent);
|
||||
if (node->parent)
|
||||
{
|
||||
fprintf(stderr, " BEFORE: node->parent->child=%p\n", node->parent->child);
|
||||
fprintf(stderr, " BEFORE: node->parent->last_child=%p\n", node->parent->last_child);
|
||||
}
|
||||
fprintf(stderr, " BEFORE: node->child=%p\n", node->child);
|
||||
fprintf(stderr, " BEFORE: node->last_child=%p\n", node->last_child);
|
||||
fprintf(stderr, " BEFORE: node->prev=%p\n", node->prev);
|
||||
fprintf(stderr, " BEFORE: node->next=%p\n", node->next);
|
||||
#endif /* DEBUG > 1 */
|
||||
|
||||
if (node->prev)
|
||||
node->prev->next = node->next;
|
||||
else
|
||||
node->parent->child = node->next;
|
||||
|
||||
if (node->next)
|
||||
node->next->prev = node->prev;
|
||||
else
|
||||
node->parent->last_child = node->prev;
|
||||
|
||||
node->parent = NULL;
|
||||
node->prev = NULL;
|
||||
node->next = NULL;
|
||||
|
||||
#if DEBUG > 1
|
||||
fprintf(stderr, " AFTER: node->parent=%p\n", node->parent);
|
||||
if (node->parent)
|
||||
{
|
||||
fprintf(stderr, " AFTER: node->parent->child=%p\n", node->parent->child);
|
||||
fprintf(stderr, " AFTER: node->parent->last_child=%p\n", node->parent->last_child);
|
||||
}
|
||||
fprintf(stderr, " AFTER: node->child=%p\n", node->child);
|
||||
fprintf(stderr, " AFTER: node->last_child=%p\n", node->last_child);
|
||||
fprintf(stderr, " AFTER: node->prev=%p\n", node->prev);
|
||||
fprintf(stderr, " AFTER: node->next=%p\n", node->next);
|
||||
#endif /* DEBUG > 1 */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxml_new()' - Create a new node.
|
||||
*/
|
||||
|
||||
static mxml_node_t * /* O - New node */
|
||||
mxml_new(mxml_node_t *parent, /* I - Parent node */
|
||||
mxml_type_t type) /* I - Node type */
|
||||
{
|
||||
mxml_node_t *node; /* New node */
|
||||
|
||||
|
||||
#if DEBUG > 1
|
||||
fprintf(stderr, "mxml_new(parent=%p, type=%d)\n", parent, type);
|
||||
#endif /* DEBUG > 1 */
|
||||
|
||||
/*
|
||||
* Allocate memory for the node...
|
||||
*/
|
||||
|
||||
if ((node = calloc(1, sizeof(mxml_node_t))) == NULL)
|
||||
{
|
||||
#if DEBUG > 1
|
||||
fputs(" returning NULL\n", stderr);
|
||||
#endif /* DEBUG > 1 */
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
#if DEBUG > 1
|
||||
fprintf(stderr, " returning %p\n", node);
|
||||
#endif /* DEBUG > 1 */
|
||||
|
||||
/*
|
||||
* Set the node type...
|
||||
*/
|
||||
|
||||
node->type = type;
|
||||
|
||||
/*
|
||||
* Add to the parent if present...
|
||||
*/
|
||||
|
||||
if (parent)
|
||||
mxmlAdd(parent, MXML_ADD_AFTER, MXML_ADD_TO_PARENT, node);
|
||||
|
||||
/*
|
||||
* Return the new node...
|
||||
*/
|
||||
|
||||
return (node);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
|
@ -0,0 +1,128 @@
|
|||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Private functions for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2005 by Michael Sweet.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxml_error() - Display an error message.
|
||||
* mxml_integer_cb() - Default callback for integer values.
|
||||
* mxml_opaque_cb() - Default callback for opaque values.
|
||||
* mxml_real_cb() - Default callback for real number values.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mxml.h"
|
||||
|
||||
|
||||
/*
|
||||
* Error callback function...
|
||||
*/
|
||||
|
||||
void (*mxml_error_cb)(const char *) = NULL;
|
||||
|
||||
|
||||
/*
|
||||
* 'mxml_error()' - Display an error message.
|
||||
*/
|
||||
|
||||
void
|
||||
mxml_error(const char *format, /* I - Printf-style format string */
|
||||
...) /* I - Additional arguments as needed */
|
||||
{
|
||||
va_list ap; /* Pointer to arguments */
|
||||
char *s; /* Message string */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!format)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Format the error message string...
|
||||
*/
|
||||
|
||||
va_start(ap, format);
|
||||
|
||||
s = mxml_strdupf(format, ap);
|
||||
|
||||
va_end(ap);
|
||||
|
||||
/*
|
||||
* And then display the error message...
|
||||
*/
|
||||
|
||||
if (mxml_error_cb)
|
||||
(*mxml_error_cb)(s);
|
||||
else
|
||||
fprintf(stderr, "mxml: %s\n", s);
|
||||
|
||||
/*
|
||||
* Free the string...
|
||||
*/
|
||||
|
||||
free(s);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxml_integer_cb()' - Default callback for integer values.
|
||||
*/
|
||||
|
||||
mxml_type_t /* O - Node type */
|
||||
mxml_integer_cb(mxml_node_t *node) /* I - Current node */
|
||||
{
|
||||
(void)node;
|
||||
|
||||
return (MXML_INTEGER);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxml_opaque_cb()' - Default callback for opaque values.
|
||||
*/
|
||||
|
||||
mxml_type_t /* O - Node type */
|
||||
mxml_opaque_cb(mxml_node_t *node) /* I - Current node */
|
||||
{
|
||||
(void)node;
|
||||
|
||||
return (MXML_OPAQUE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxml_real_cb()' - Default callback for real number values.
|
||||
*/
|
||||
|
||||
mxml_type_t /* O - Node type */
|
||||
mxml_real_cb(mxml_node_t *node) /* I - Current node */
|
||||
{
|
||||
(void)node;
|
||||
|
||||
return (MXML_REAL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
|
@ -0,0 +1,199 @@
|
|||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Search/navigation functions for Mini-XML, a small XML-like file
|
||||
* parsing library.
|
||||
*
|
||||
* Copyright 2003-2005 by Michael Sweet.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxmlFindElement() - Find the named element.
|
||||
* mxmlWalkNext() - Walk to the next logical node in the tree.
|
||||
* mxmlWalkPrev() - Walk to the previous logical node in the tree.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mxml.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlFindElement()' - Find the named element.
|
||||
*
|
||||
* The search is constrained by the name, attribute name, and value; any
|
||||
* NULL names or values are treated as wildcards, so different kinds of
|
||||
* searches can be implemented by looking for all elements of a given name
|
||||
* or all elements with a specific attribute. The descend argument determines
|
||||
* whether the search descends into child nodes; normally you will use
|
||||
* MXML_DESCEND_FIRST for the initial search and MXML_NO_DESCEND to find
|
||||
* additional direct descendents of the node. The top node argument
|
||||
* constrains the search to a particular node's children.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - Element node or NULL */
|
||||
mxmlFindElement(mxml_node_t *node, /* I - Current node */
|
||||
mxml_node_t *top, /* I - Top node */
|
||||
const char *name, /* I - Element name or NULL for any */
|
||||
const char *attr, /* I - Attribute name, or NULL for none */
|
||||
const char *value, /* I - Attribute value, or NULL for any */
|
||||
int descend) /* I - Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST */
|
||||
{
|
||||
const char *temp; /* Current attribute value */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || !top || (!attr && value))
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* Start with the next node...
|
||||
*/
|
||||
|
||||
node = mxmlWalkNext(node, top, descend);
|
||||
|
||||
/*
|
||||
* Loop until we find a matching element...
|
||||
*/
|
||||
|
||||
while (node != NULL)
|
||||
{
|
||||
/*
|
||||
* See if this node matches...
|
||||
*/
|
||||
|
||||
if (node->type == MXML_ELEMENT &&
|
||||
node->value.element.name &&
|
||||
(!name || !strcmp(node->value.element.name, name)))
|
||||
{
|
||||
/*
|
||||
* See if we need to check for an attribute...
|
||||
*/
|
||||
|
||||
if (!attr)
|
||||
return (node); /* No attribute search, return it... */
|
||||
|
||||
/*
|
||||
* Check for the attribute...
|
||||
*/
|
||||
|
||||
if ((temp = mxmlElementGetAttr(node, attr)) != NULL)
|
||||
{
|
||||
/*
|
||||
* OK, we have the attribute, does it match?
|
||||
*/
|
||||
|
||||
if (!value || !strcmp(value, temp))
|
||||
return (node); /* Yes, return it... */
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* No match, move on to the next node...
|
||||
*/
|
||||
|
||||
if (descend == MXML_DESCEND)
|
||||
node = mxmlWalkNext(node, top, MXML_DESCEND);
|
||||
else
|
||||
node = node->next;
|
||||
}
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlWalkNext()' - Walk to the next logical node in the tree.
|
||||
*
|
||||
* The descend argument controls whether the first child is considered
|
||||
* to be the next node. The top node argument constrains the walk to
|
||||
* the node's children.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - Next node or NULL */
|
||||
mxmlWalkNext(mxml_node_t *node, /* I - Current node */
|
||||
mxml_node_t *top, /* I - Top node */
|
||||
int descend) /* I - Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST */
|
||||
{
|
||||
if (!node)
|
||||
return (NULL);
|
||||
else if (node->child && descend)
|
||||
return (node->child);
|
||||
else if (node->next)
|
||||
return (node->next);
|
||||
else if (node->parent && node->parent != top)
|
||||
{
|
||||
node = node->parent;
|
||||
|
||||
while (!node->next)
|
||||
if (node->parent == top || !node->parent)
|
||||
return (NULL);
|
||||
else
|
||||
node = node->parent;
|
||||
|
||||
return (node->next);
|
||||
}
|
||||
else
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlWalkPrev()' - Walk to the previous logical node in the tree.
|
||||
*
|
||||
* The descend argument controls whether the previous node's last child
|
||||
* is considered to be the previous node. The top node argument constrains
|
||||
* the walk to the node's children.
|
||||
*/
|
||||
|
||||
mxml_node_t * /* O - Previous node or NULL */
|
||||
mxmlWalkPrev(mxml_node_t *node, /* I - Current node */
|
||||
mxml_node_t *top, /* I - Top node */
|
||||
int descend) /* I - Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST */
|
||||
{
|
||||
if (!node)
|
||||
return (NULL);
|
||||
else if (node->prev)
|
||||
{
|
||||
if (node->prev->last_child && descend)
|
||||
{
|
||||
/*
|
||||
* Find the last child under the previous node...
|
||||
*/
|
||||
|
||||
node = node->prev->last_child;
|
||||
|
||||
while (node->last_child)
|
||||
node = node->last_child;
|
||||
|
||||
return (node);
|
||||
}
|
||||
else
|
||||
return (node->prev);
|
||||
}
|
||||
else if (node->parent != top)
|
||||
return (node->parent);
|
||||
else
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
|
@ -0,0 +1,257 @@
|
|||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Node set functions for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2005 by Michael Sweet.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxmlSetElement() - Set the name of an element node.
|
||||
* mxmlSetInteger() - Set the value of an integer node.
|
||||
* mxmlSetOpaque() - Set the value of an opaque node.
|
||||
* mxmlSetReal() - Set the value of a real number node.
|
||||
* mxmlSetText() - Set the value of a text node.
|
||||
* mxmlSetTextf() - Set the value of a text node to a formatted string.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "mxml.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetCustom()' - Set the data and destructor of a custom data node.
|
||||
*
|
||||
* The node is not changed if it is not a custom node.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetCustom(mxml_node_t *node, /* I - Node to set */
|
||||
void *data, /* I - New data pointer */
|
||||
void (*destroy)(void *))
|
||||
/* I - New destructor function */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_CUSTOM)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Free any old element value and set the new value...
|
||||
*/
|
||||
|
||||
if (node->value.custom.data && node->value.custom.destroy)
|
||||
(*(node->value.custom.destroy))(node->value.custom.data);
|
||||
|
||||
node->value.custom.data = data;
|
||||
node->value.custom.destroy = destroy;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetElement()' - Set the name of an element node.
|
||||
*
|
||||
* The node is not changed if it is not an element node.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetElement(mxml_node_t *node, /* I - Node to set */
|
||||
const char *name) /* I - New name string */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_ELEMENT || !name)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Free any old element value and set the new value...
|
||||
*/
|
||||
|
||||
if (node->value.element.name)
|
||||
free(node->value.element.name);
|
||||
|
||||
node->value.element.name = strdup(name);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetInteger()' - Set the value of an integer node.
|
||||
*
|
||||
* The node is not changed if it is not an integer node.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetInteger(mxml_node_t *node, /* I - Node to set */
|
||||
int integer) /* I - Integer value */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_INTEGER)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Set the new value and return...
|
||||
*/
|
||||
|
||||
node->value.integer = integer;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetOpaque()' - Set the value of an opaque node.
|
||||
*
|
||||
* The node is not changed if it is not an opaque node.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetOpaque(mxml_node_t *node, /* I - Node to set */
|
||||
const char *opaque) /* I - Opaque string */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_OPAQUE || !opaque)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Free any old opaque value and set the new value...
|
||||
*/
|
||||
|
||||
if (node->value.opaque)
|
||||
free(node->value.opaque);
|
||||
|
||||
node->value.opaque = strdup(opaque);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetReal()' - Set the value of a real number node.
|
||||
*
|
||||
* The node is not changed if it is not a real number node.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetReal(mxml_node_t *node, /* I - Node to set */
|
||||
double real) /* I - Real number value */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_REAL)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Set the new value and return...
|
||||
*/
|
||||
|
||||
node->value.real = real;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetText()' - Set the value of a text node.
|
||||
*
|
||||
* The node is not changed if it is not a text node.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetText(mxml_node_t *node, /* I - Node to set */
|
||||
int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */
|
||||
const char *string) /* I - String */
|
||||
{
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_TEXT || !string)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Free any old string value and set the new value...
|
||||
*/
|
||||
|
||||
if (node->value.text.string)
|
||||
free(node->value.text.string);
|
||||
|
||||
node->value.text.whitespace = whitespace;
|
||||
node->value.text.string = strdup(string);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 'mxmlSetTextf()' - Set the value of a text node to a formatted string.
|
||||
*
|
||||
* The node is not changed if it is not a text node.
|
||||
*/
|
||||
|
||||
int /* O - 0 on success, -1 on failure */
|
||||
mxmlSetTextf(mxml_node_t *node, /* I - Node to set */
|
||||
int whitespace, /* I - 1 = leading whitespace, 0 = no whitespace */
|
||||
const char *format, /* I - Printf-style format string */
|
||||
...) /* I - Additional arguments as needed */
|
||||
{
|
||||
va_list ap; /* Pointer to arguments */
|
||||
|
||||
|
||||
/*
|
||||
* Range check input...
|
||||
*/
|
||||
|
||||
if (!node || node->type != MXML_TEXT || !format)
|
||||
return (-1);
|
||||
|
||||
/*
|
||||
* Free any old string value and set the new value...
|
||||
*/
|
||||
|
||||
if (node->value.text.string)
|
||||
free(node->value.text.string);
|
||||
|
||||
va_start(ap, format);
|
||||
|
||||
node->value.text.whitespace = whitespace;
|
||||
node->value.text.string = mxml_strdupf(format, ap);
|
||||
|
||||
va_end(ap);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
|
@ -0,0 +1,377 @@
|
|||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* String functions for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2005 by Michael Sweet.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
* mxml_strdup() - Duplicate a string.
|
||||
* mxml_strdupf() - Format and duplicate a string.
|
||||
* mxml_vsnprintf() - Format a string into a fixed size buffer.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
||||
/*
|
||||
* 'mxml_strdup()' - Duplicate a string.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_STRDUP
|
||||
char * /* O - New string pointer */
|
||||
mxml_strdup(const char *s) /* I - String to duplicate */
|
||||
{
|
||||
char *t; /* New string pointer */
|
||||
|
||||
|
||||
if (s == NULL)
|
||||
return (NULL);
|
||||
|
||||
if ((t = malloc(strlen(s) + 1)) == NULL)
|
||||
return (NULL);
|
||||
|
||||
return (strcpy(t, s));
|
||||
}
|
||||
#endif /* !HAVE_STRDUP */
|
||||
|
||||
|
||||
/*
|
||||
* 'mxml_strdupf()' - Format and duplicate a string.
|
||||
*/
|
||||
|
||||
char * /* O - New string pointer */
|
||||
mxml_strdupf(const char *format, /* I - Printf-style format string */
|
||||
va_list ap) /* I - Pointer to additional arguments */
|
||||
{
|
||||
int bytes; /* Number of bytes required */
|
||||
char *buffer, /* String buffer */
|
||||
temp[256]; /* Small buffer for first vsnprintf */
|
||||
|
||||
|
||||
/*
|
||||
* First format with a tiny buffer; this will tell us how many bytes are
|
||||
* needed...
|
||||
*/
|
||||
|
||||
bytes = vsnprintf(temp, sizeof(temp), format, ap);
|
||||
|
||||
if (bytes < sizeof(temp))
|
||||
{
|
||||
/*
|
||||
* Hey, the formatted string fits in the tiny buffer, so just dup that...
|
||||
*/
|
||||
|
||||
return (strdup(temp));
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate memory for the whole thing and reformat to the new, larger
|
||||
* buffer...
|
||||
*/
|
||||
|
||||
if ((buffer = calloc(1, bytes + 1)) != NULL)
|
||||
vsnprintf(buffer, bytes + 1, format, ap);
|
||||
|
||||
/*
|
||||
* Return the new string...
|
||||
*/
|
||||
|
||||
return (buffer);
|
||||
}
|
||||
|
||||
|
||||
#ifndef HAVE_VSNPRINTF
|
||||
/*
|
||||
* 'mxml_vsnprintf()' - Format a string into a fixed size buffer.
|
||||
*/
|
||||
|
||||
int /* O - Number of bytes formatted */
|
||||
mxml_vsnprintf(char *buffer, /* O - Output buffer */
|
||||
size_t bufsize, /* O - Size of output buffer */
|
||||
const char *format, /* I - Printf-style format string */
|
||||
va_list ap) /* I - Pointer to additional arguments */
|
||||
{
|
||||
char *bufptr, /* Pointer to position in buffer */
|
||||
*bufend, /* Pointer to end of buffer */
|
||||
sign, /* Sign of format width */
|
||||
size, /* Size character (h, l, L) */
|
||||
type; /* Format type character */
|
||||
const char *bufformat; /* Start of format */
|
||||
int width, /* Width of field */
|
||||
prec; /* Number of characters of precision */
|
||||
char tformat[100], /* Temporary format string for sprintf() */
|
||||
temp[1024]; /* Buffer for formatted numbers */
|
||||
char *s; /* Pointer to string */
|
||||
int slen; /* Length of string */
|
||||
int bytes; /* Total number of bytes needed */
|
||||
|
||||
|
||||
/*
|
||||
* Loop through the format string, formatting as needed...
|
||||
*/
|
||||
|
||||
bufptr = buffer;
|
||||
bufend = buffer + bufsize - 1;
|
||||
bytes = 0;
|
||||
|
||||
while (*format)
|
||||
{
|
||||
if (*format == '%')
|
||||
{
|
||||
bufformat = format;
|
||||
format ++;
|
||||
|
||||
if (*format == '%')
|
||||
{
|
||||
*bufptr++ = *format++;
|
||||
continue;
|
||||
}
|
||||
else if (strchr(" -+#\'", *format))
|
||||
sign = *format++;
|
||||
else
|
||||
sign = 0;
|
||||
|
||||
width = 0;
|
||||
while (isdigit(*format))
|
||||
width = width * 10 + *format++ - '0';
|
||||
|
||||
if (*format == '.')
|
||||
{
|
||||
format ++;
|
||||
prec = 0;
|
||||
|
||||
while (isdigit(*format))
|
||||
prec = prec * 10 + *format++ - '0';
|
||||
}
|
||||
else
|
||||
prec = -1;
|
||||
|
||||
if (*format == 'l' && format[1] == 'l')
|
||||
{
|
||||
size = 'L';
|
||||
format += 2;
|
||||
}
|
||||
else if (*format == 'h' || *format == 'l' || *format == 'L')
|
||||
size = *format++;
|
||||
|
||||
if (!*format)
|
||||
break;
|
||||
|
||||
type = *format++;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case 'E' : /* Floating point formats */
|
||||
case 'G' :
|
||||
case 'e' :
|
||||
case 'f' :
|
||||
case 'g' :
|
||||
if ((format - bufformat + 1) > sizeof(tformat) ||
|
||||
(width + 2) > sizeof(temp))
|
||||
break;
|
||||
|
||||
strncpy(tformat, bufformat, format - bufformat);
|
||||
tformat[format - bufformat] = '\0';
|
||||
|
||||
sprintf(temp, tformat, va_arg(ap, double));
|
||||
|
||||
bytes += strlen(temp);
|
||||
|
||||
if (bufptr)
|
||||
{
|
||||
if ((bufptr + strlen(temp)) > bufend)
|
||||
{
|
||||
strncpy(bufptr, temp, bufend - bufptr);
|
||||
bufptr = bufend;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(bufptr, temp);
|
||||
bufptr += strlen(temp);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'B' : /* Integer formats */
|
||||
case 'X' :
|
||||
case 'b' :
|
||||
case 'd' :
|
||||
case 'i' :
|
||||
case 'o' :
|
||||
case 'u' :
|
||||
case 'x' :
|
||||
if ((format - bufformat + 1) > sizeof(tformat) ||
|
||||
(width + 2) > sizeof(temp))
|
||||
break;
|
||||
|
||||
strncpy(tformat, bufformat, format - bufformat);
|
||||
tformat[format - bufformat] = '\0';
|
||||
|
||||
sprintf(temp, tformat, va_arg(ap, int));
|
||||
|
||||
bytes += strlen(temp);
|
||||
|
||||
if (bufptr)
|
||||
{
|
||||
if ((bufptr + strlen(temp)) > bufend)
|
||||
{
|
||||
strncpy(bufptr, temp, bufend - bufptr);
|
||||
bufptr = bufend;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(bufptr, temp);
|
||||
bufptr += strlen(temp);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'p' : /* Pointer value */
|
||||
if ((format - bufformat + 1) > sizeof(tformat) ||
|
||||
(width + 2) > sizeof(temp))
|
||||
break;
|
||||
|
||||
strncpy(tformat, bufformat, format - bufformat);
|
||||
tformat[format - bufformat] = '\0';
|
||||
|
||||
sprintf(temp, tformat, va_arg(ap, void *));
|
||||
|
||||
bytes += strlen(temp);
|
||||
|
||||
if (bufptr)
|
||||
{
|
||||
if ((bufptr + strlen(temp)) > bufend)
|
||||
{
|
||||
strncpy(bufptr, temp, bufend - bufptr);
|
||||
bufptr = bufend;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(bufptr, temp);
|
||||
bufptr += strlen(temp);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'c' : /* Character or character array */
|
||||
bytes += width;
|
||||
|
||||
if (bufptr)
|
||||
{
|
||||
if (width <= 1)
|
||||
*bufptr++ = va_arg(ap, int);
|
||||
else
|
||||
{
|
||||
if ((bufptr + width) > bufend)
|
||||
width = bufend - bufptr;
|
||||
|
||||
memcpy(bufptr, va_arg(ap, char *), width);
|
||||
bufptr += width;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 's' : /* String */
|
||||
if ((s = va_arg(ap, char *)) == NULL)
|
||||
s = "(null)";
|
||||
|
||||
slen = strlen(s);
|
||||
if (slen > width && prec != width)
|
||||
width = slen;
|
||||
|
||||
bytes += width;
|
||||
|
||||
if (bufptr)
|
||||
{
|
||||
if ((bufptr + width) > bufend)
|
||||
width = bufend - bufptr;
|
||||
|
||||
if (slen > width)
|
||||
slen = width;
|
||||
|
||||
if (sign == '-')
|
||||
{
|
||||
strncpy(bufptr, s, slen);
|
||||
memset(bufptr + slen, ' ', width - slen);
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(bufptr, ' ', width - slen);
|
||||
strncpy(bufptr + width - slen, s, slen);
|
||||
}
|
||||
|
||||
bufptr += width;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'n' : /* Output number of chars so far */
|
||||
if ((format - bufformat + 1) > sizeof(tformat) ||
|
||||
(width + 2) > sizeof(temp))
|
||||
break;
|
||||
|
||||
strncpy(tformat, bufformat, format - bufformat);
|
||||
tformat[format - bufformat] = '\0';
|
||||
|
||||
sprintf(temp, tformat, va_arg(ap, int));
|
||||
|
||||
bytes += strlen(temp);
|
||||
|
||||
if (bufptr)
|
||||
{
|
||||
if ((bufptr + strlen(temp)) > bufend)
|
||||
{
|
||||
strncpy(bufptr, temp, bufend - bufptr);
|
||||
bufptr = bufend;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(bufptr, temp);
|
||||
bufptr += strlen(temp);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bytes ++;
|
||||
|
||||
if (bufptr && bufptr < bufend)
|
||||
*bufptr++ = *format++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Nul-terminate the string and return the number of characters needed.
|
||||
*/
|
||||
|
||||
*bufptr = '\0';
|
||||
|
||||
return (bytes);
|
||||
}
|
||||
#endif /* !HAVE_VSNPRINTF */
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
|
@ -0,0 +1,254 @@
|
|||
/*
|
||||
* "$Id$"
|
||||
*
|
||||
* Header file for Mini-XML, a small XML-like file parsing library.
|
||||
*
|
||||
* Copyright 2003-2005 by Michael Sweet.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Prevent multiple inclusion...
|
||||
*/
|
||||
|
||||
#ifndef _mxml_h_
|
||||
# define _mxml_h_
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
# include <stdio.h>
|
||||
# include <stdlib.h>
|
||||
# include <string.h>
|
||||
# include <ctype.h>
|
||||
# include <errno.h>
|
||||
|
||||
|
||||
/*
|
||||
* Constants...
|
||||
*/
|
||||
|
||||
# define MXML_WRAP 72 /* Wrap XML output at this column position */
|
||||
# define MXML_TAB 8 /* Tabs every N columns */
|
||||
|
||||
# define MXML_NO_CALLBACK 0 /* Don't use a type callback */
|
||||
# define MXML_INTEGER_CALLBACK mxml_integer_cb
|
||||
/* Treat all data as integers */
|
||||
# define MXML_OPAQUE_CALLBACK mxml_opaque_cb
|
||||
/* Treat all data as opaque */
|
||||
# define MXML_REAL_CALLBACK mxml_real_cb
|
||||
/* Treat all data as real numbers */
|
||||
# define MXML_TEXT_CALLBACK 0 /* Treat all data as text */
|
||||
|
||||
# define MXML_NO_PARENT 0 /* No parent for the node */
|
||||
|
||||
# define MXML_DESCEND 1 /* Descend when finding/walking */
|
||||
# define MXML_NO_DESCEND 0 /* Don't descend when finding/walking */
|
||||
# define MXML_DESCEND_FIRST -1 /* Descend for first find */
|
||||
|
||||
# define MXML_WS_BEFORE_OPEN 0 /* Callback for before open tag */
|
||||
# define MXML_WS_AFTER_OPEN 1 /* Callback for after open tag */
|
||||
# define MXML_WS_BEFORE_CLOSE 2 /* Callback for before close tag */
|
||||
# define MXML_WS_AFTER_CLOSE 3 /* Callback for after close tag */
|
||||
|
||||
# define MXML_ADD_BEFORE 0 /* Add node before specified node */
|
||||
# define MXML_ADD_AFTER 1 /* Add node after specified node */
|
||||
# define MXML_ADD_TO_PARENT NULL /* Add node relative to parent */
|
||||
|
||||
|
||||
/*
|
||||
* Data types...
|
||||
*/
|
||||
|
||||
typedef enum mxml_type_e /**** The XML node type. ****/
|
||||
{
|
||||
MXML_ELEMENT, /* XML element with attributes */
|
||||
MXML_INTEGER, /* Integer value */
|
||||
MXML_OPAQUE, /* Opaque string */
|
||||
MXML_REAL, /* Real value */
|
||||
MXML_TEXT, /* Text fragment */
|
||||
MXML_CUSTOM /* Custom data */
|
||||
} mxml_type_t;
|
||||
|
||||
typedef struct mxml_attr_s /**** An XML element attribute value. ****/
|
||||
{
|
||||
char *name; /* Attribute name */
|
||||
char *value; /* Attribute value */
|
||||
} mxml_attr_t;
|
||||
|
||||
typedef struct mxml_value_s /**** An XML element value. ****/
|
||||
{
|
||||
char *name; /* Name of element */
|
||||
int num_attrs; /* Number of attributes */
|
||||
mxml_attr_t *attrs; /* Attributes */
|
||||
} mxml_element_t;
|
||||
|
||||
typedef struct mxml_text_s /**** An XML text value. ****/
|
||||
{
|
||||
int whitespace; /* Leading whitespace? */
|
||||
char *string; /* Fragment string */
|
||||
} mxml_text_t;
|
||||
|
||||
typedef struct mxml_custom_s /**** An XML custom value. ****/
|
||||
{
|
||||
void *data; /* Pointer to (allocated) custom data */
|
||||
void (*destroy)(void *);
|
||||
/* Pointer to destructor function */
|
||||
} mxml_custom_t;
|
||||
|
||||
typedef union mxml_value_u /**** An XML node value. ****/
|
||||
{
|
||||
mxml_element_t element; /* Element */
|
||||
int integer; /* Integer number */
|
||||
char *opaque; /* Opaque string */
|
||||
double real; /* Real number */
|
||||
mxml_text_t text; /* Text fragment */
|
||||
mxml_custom_t custom; /* Custom data */
|
||||
} mxml_value_t;
|
||||
|
||||
typedef struct mxml_node_s /**** An XML node. ****/
|
||||
{
|
||||
mxml_type_t type; /* Node type */
|
||||
struct mxml_node_s *next; /* Next node under same parent */
|
||||
struct mxml_node_s *prev; /* Previous node under same parent */
|
||||
struct mxml_node_s *parent; /* Parent node */
|
||||
struct mxml_node_s *child; /* First child node */
|
||||
struct mxml_node_s *last_child; /* Last child node */
|
||||
mxml_value_t value; /* Node value */
|
||||
} mxml_node_t;
|
||||
|
||||
typedef struct mxml_index_s /**** An XML node index. ****/
|
||||
{
|
||||
char *attr; /* Attribute used for indexing or NULL */
|
||||
int num_nodes; /* Number of nodes in index */
|
||||
int alloc_nodes; /* Allocated nodes in index */
|
||||
int cur_node; /* Current node */
|
||||
mxml_node_t **nodes; /* Node array */
|
||||
} mxml_index_t;
|
||||
|
||||
typedef int (*mxml_custom_load_cb_t)(mxml_node_t *, const char *);
|
||||
/**** Custom data load callback function ****/
|
||||
|
||||
typedef char *(*mxml_custom_save_cb_t)(mxml_node_t *);
|
||||
/**** Custom data save callback function ****/
|
||||
|
||||
|
||||
/*
|
||||
* C++ support...
|
||||
*/
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
# endif /* __cplusplus */
|
||||
|
||||
/*
|
||||
* Prototypes...
|
||||
*/
|
||||
|
||||
extern void mxmlAdd(mxml_node_t *parent, int where,
|
||||
mxml_node_t *child, mxml_node_t *node);
|
||||
extern void mxmlDelete(mxml_node_t *node);
|
||||
extern const char *mxmlElementGetAttr(mxml_node_t *node, const char *name);
|
||||
extern void mxmlElementSetAttr(mxml_node_t *node, const char *name,
|
||||
const char *value);
|
||||
extern int mxmlEntityAddCallback(int (*cb)(const char *name));
|
||||
extern const char *mxmlEntityGetName(int val);
|
||||
extern int mxmlEntityGetValue(const char *name);
|
||||
extern void mxmlEntityRemoveCallback(int (*cb)(const char *name));
|
||||
extern mxml_node_t *mxmlFindElement(mxml_node_t *node, mxml_node_t *top,
|
||||
const char *name, const char *attr,
|
||||
const char *value, int descend);
|
||||
extern void mxmlIndexDelete(mxml_index_t *ind);
|
||||
extern mxml_node_t *mxmlIndexEnum(mxml_index_t *ind);
|
||||
extern mxml_node_t *mxmlIndexFind(mxml_index_t *ind,
|
||||
const char *element,
|
||||
const char *value);
|
||||
extern mxml_index_t *mxmlIndexNew(mxml_node_t *node, const char *element,
|
||||
const char *attr);
|
||||
extern mxml_node_t *mxmlIndexReset(mxml_index_t *ind);
|
||||
extern mxml_node_t *mxmlLoadFd(mxml_node_t *top, int fd,
|
||||
mxml_type_t (*cb)(mxml_node_t *));
|
||||
extern mxml_node_t *mxmlLoadFile(mxml_node_t *top, FILE *fp,
|
||||
mxml_type_t (*cb)(mxml_node_t *));
|
||||
extern mxml_node_t *mxmlLoadString(mxml_node_t *top, const char *s,
|
||||
mxml_type_t (*cb)(mxml_node_t *));
|
||||
extern mxml_node_t *mxmlNewCustom(mxml_node_t *parent, void *data,
|
||||
void (*destroy)(void *));
|
||||
extern mxml_node_t *mxmlNewElement(mxml_node_t *parent, const char *name);
|
||||
extern mxml_node_t *mxmlNewInteger(mxml_node_t *parent, int integer);
|
||||
extern mxml_node_t *mxmlNewOpaque(mxml_node_t *parent, const char *opaque);
|
||||
extern mxml_node_t *mxmlNewReal(mxml_node_t *parent, double real);
|
||||
extern mxml_node_t *mxmlNewText(mxml_node_t *parent, int whitespace,
|
||||
const char *string);
|
||||
extern mxml_node_t *mxmlNewTextf(mxml_node_t *parent, int whitespace,
|
||||
const char *format, ...)
|
||||
# ifdef __GNUC__
|
||||
__attribute__ ((__format__ (__printf__, 3, 4)))
|
||||
# endif /* __GNUC__ */
|
||||
;
|
||||
extern void mxmlRemove(mxml_node_t *node);
|
||||
extern char *mxmlSaveAllocString(mxml_node_t *node,
|
||||
const char *(*cb)(mxml_node_t *, int));
|
||||
extern int mxmlSaveFd(mxml_node_t *node, int fd,
|
||||
const char *(*cb)(mxml_node_t *, int));
|
||||
extern int mxmlSaveFile(mxml_node_t *node, FILE *fp,
|
||||
const char *(*cb)(mxml_node_t *, int));
|
||||
extern int mxmlSaveString(mxml_node_t *node, char *buffer,
|
||||
int bufsize,
|
||||
const char *(*cb)(mxml_node_t *, int));
|
||||
extern int mxmlSetCustom(mxml_node_t *node, void *data,
|
||||
void (*destroy)(void *));
|
||||
extern void mxmlSetCustomHandlers(mxml_custom_load_cb_t load,
|
||||
mxml_custom_save_cb_t save);
|
||||
extern int mxmlSetElement(mxml_node_t *node, const char *name);
|
||||
extern void mxmlSetErrorCallback(void (*cb)(const char *));
|
||||
extern int mxmlSetInteger(mxml_node_t *node, int integer);
|
||||
extern int mxmlSetOpaque(mxml_node_t *node, const char *opaque);
|
||||
extern int mxmlSetReal(mxml_node_t *node, double real);
|
||||
extern int mxmlSetText(mxml_node_t *node, int whitespace,
|
||||
const char *string);
|
||||
extern int mxmlSetTextf(mxml_node_t *node, int whitespace,
|
||||
const char *format, ...)
|
||||
# ifdef __GNUC__
|
||||
__attribute__ ((__format__ (__printf__, 3, 4)))
|
||||
# endif /* __GNUC__ */
|
||||
;
|
||||
extern mxml_node_t *mxmlWalkNext(mxml_node_t *node, mxml_node_t *top,
|
||||
int descend);
|
||||
extern mxml_node_t *mxmlWalkPrev(mxml_node_t *node, mxml_node_t *top,
|
||||
int descend);
|
||||
|
||||
|
||||
/*
|
||||
* Private functions...
|
||||
*/
|
||||
|
||||
extern void mxml_error(const char *format, ...);
|
||||
extern mxml_type_t mxml_integer_cb(mxml_node_t *node);
|
||||
extern mxml_type_t mxml_opaque_cb(mxml_node_t *node);
|
||||
extern mxml_type_t mxml_real_cb(mxml_node_t *node);
|
||||
|
||||
|
||||
/*
|
||||
* C++ support...
|
||||
*/
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif /* __cplusplus */
|
||||
#endif /* !_mxml_h_ */
|
||||
|
||||
|
||||
/*
|
||||
* End of "$Id$".
|
||||
*/
|
|
@ -0,0 +1,114 @@
|
|||
#
|
||||
# "$Id$"
|
||||
#
|
||||
# EPM software list file for Mini-XML, a small XML library.
|
||||
#
|
||||
# Copyright 2003-2005 by Michael Sweet.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Library General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
|
||||
# Directories...
|
||||
$prefix=@prefix@
|
||||
$exec_prefix=@exec_prefix@
|
||||
$bindir=@bindir@
|
||||
$docdir=@docdir@
|
||||
$includedir=@includedir@
|
||||
$libdir=@libdir@
|
||||
$mandir=@mandir@
|
||||
$srcdir=@srcdir@
|
||||
|
||||
$PICFLAG=@PICFLAG@
|
||||
|
||||
# Product information
|
||||
%product mxml
|
||||
%copyright 2003-2005 by Michael Sweet
|
||||
%vendor Michael Sweet
|
||||
%license ${srcdir}/COPYING
|
||||
%readme ${srcdir}/README
|
||||
%version @VERSION@
|
||||
|
||||
%description <<EOF
|
||||
Mini-XML is a small XML parsing library that you can use to read
|
||||
XML and XML-like data files in your application without
|
||||
requiring large non-standard libraries. Mini-XML provides the
|
||||
following functionality:
|
||||
|
||||
- Reading of UTF-8 and UTF-16 and writing of UTF-8 encoded
|
||||
XML files and strings.
|
||||
- Data is stored in a linked-list tree structure, preserving
|
||||
the XML data hierarchy.
|
||||
- Supports arbitrary element names, attributes, and
|
||||
attribute values with no preset limits, just available
|
||||
memory.
|
||||
- Supports integer, real, opaque ("cdata"), and text data
|
||||
types in "leaf" nodes.
|
||||
- Functions for creating and managing trees of data.
|
||||
- "Find" and "walk" functions for easily locating and
|
||||
navigating trees of data.
|
||||
|
||||
Mini-XML doesn't do validation or other types of processing on
|
||||
the data based upon schema files or other sources of definition
|
||||
information, nor does it support character entities other than
|
||||
those required by the XML specification.
|
||||
EOF
|
||||
|
||||
# Manpage extensions...
|
||||
$CAT1EXT=@CAT1EXT@
|
||||
$CAT3EXT=@CAT3EXT@
|
||||
$MAN1EXT=@MAN1EXT@
|
||||
$MAN3EXT=@MAN3EXT@
|
||||
|
||||
# Executables
|
||||
f 0555 root sys ${bindir}/mxmldoc mxmldoc
|
||||
|
||||
# Header files
|
||||
f 0444 root sys ${includedir}/mxml.h mxml.h
|
||||
|
||||
# Libraries
|
||||
%if $PICFLAG
|
||||
%system hpux
|
||||
f 0555 root sys ${libdir}/libmxml.sl.1 libmxml.sl.1
|
||||
l 0555 root sys ${libdir}/libmxml.sl libmxml.sl.1
|
||||
|
||||
%system dylib
|
||||
f 0555 root sys ${libdir}/libmxml.1.dylib libmxml.1.dylib
|
||||
l 0555 root sys ${libdir}/libmxml.dylib libmxml.1.dylib
|
||||
|
||||
%system freebsd irix linux netbsd openbsd solaris tru64
|
||||
f 0555 root sys ${libdir}/libmxml.so.1.0 libmxml.so.1.0
|
||||
l 0555 root sys ${libdir}/libmxml.sl.1 libmxml.sl.1.0
|
||||
l 0555 root sys ${libdir}/libmxml.sl libmxml.sl.1.0
|
||||
|
||||
%system all
|
||||
%endif
|
||||
|
||||
f 0444 root sys ${libdir}/libmxml.a libmxml.a
|
||||
|
||||
# pkg-config info
|
||||
f 0444 root sys $(libdir)/pkgconfig/mxml.pc mxml.pc
|
||||
|
||||
# Documentation
|
||||
f 0444 root sys ${docdir}/README $srcdir/README
|
||||
f 0444 root sys ${docdir}/COPYING $srcdir/COPYING
|
||||
f 0444 root sys ${docdir}/CHANGES $srcdir/CHANGES
|
||||
f 0444 root sys ${docdir}/mxml.html $srcdir/doc/mxml.html
|
||||
f 0444 root sys ${docdir}/mxml.pdf $srcdir/doc/mxml.pdf
|
||||
|
||||
# Man pages
|
||||
f 0444 root sys ${mandir}/cat1/mxmldoc.$CAT1EXT $srcdir/mxmldoc.$CAT1EXT
|
||||
f 0444 root sys ${mandir}/man1/mxmldoc.$MAN1EXT $srcdir/mxmldoc.man
|
||||
f 0444 root sys ${mandir}/cat3/mxml.$CAT3EXT $srcdir/mxml.$CAT3EXT
|
||||
f 0444 root sys ${mandir}/man3/mxml.$MAN3EXT $srcdir/mxml.man
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
#
|
|
@ -0,0 +1,10 @@
|
|||
prefix=/usr/local
|
||||
exec_prefix=/usr/local
|
||||
libdir=${exec_prefix}/lib
|
||||
includedir=${prefix}/include
|
||||
|
||||
Name: Mini-XML
|
||||
Description: Lightweight XML support library
|
||||
Version: 2.2.2
|
||||
Libs: -L${exec_prefix}/lib -lmxml
|
||||
Cflags: -I${prefix}/include
|
|
@ -0,0 +1,10 @@
|
|||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
|
||||
Name: Mini-XML
|
||||
Description: Lightweight XML support library
|
||||
Version: @VERSION@
|
||||
Libs: @PC_LIBS@
|
||||
Cflags: @PC_CFLAGS@
|
|
@ -0,0 +1,99 @@
|
|||
#
|
||||
# "$Id$"
|
||||
#
|
||||
# RPM "spec" file for Mini-XML, a small XML library.
|
||||
#
|
||||
# Copyright 2003-2005 by Michael Sweet.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Library General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
|
||||
Summary: Miniature XML development library
|
||||
Name: mxml
|
||||
Version: 2.2.2
|
||||
Release: 1
|
||||
Copyright: GPL
|
||||
Group: Development/Libraries
|
||||
Source: http://www.easysw.com/~mike/mxml/mxml-%{version}.tar.gz
|
||||
Url: http://www.easysw.com/~mike/mxml/
|
||||
Packager: Michael Sweet <mxml@easysw.com>
|
||||
Vendor: Michael Sweet
|
||||
|
||||
# Use buildroot so as not to disturb the version already installed
|
||||
BuildRoot: /var/tmp/%{name}-root
|
||||
|
||||
%description
|
||||
Mini-XML is a small XML parsing library that you can use to read
|
||||
XML and XML-like data files in your application without
|
||||
requiring large non-standard libraries. Mini-XML provides the
|
||||
following functionality:
|
||||
|
||||
- Reading of UTF-8 and UTF-16 and writing of UTF-8 encoded
|
||||
XML files and strings.
|
||||
- Data is stored in a linked-list tree structure, preserving
|
||||
the XML data hierarchy.
|
||||
- Supports arbitrary element names, attributes, and
|
||||
attribute values with no preset limits, just available
|
||||
memory.
|
||||
- Supports integer, real, opaque ("cdata"), and text data
|
||||
types in "leaf" nodes.
|
||||
- Functions for creating and managing trees of data.
|
||||
- "Find" and "walk" functions for easily locating and
|
||||
navigating trees of data.
|
||||
|
||||
Mini-XML doesn't do validation or other types of processing on
|
||||
the data based upon schema files or other sources of definition
|
||||
information, nor does it support character entities other than
|
||||
those required by the XML specification.
|
||||
|
||||
%prep
|
||||
%setup
|
||||
|
||||
%build
|
||||
CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_OPT_FLAGS" ./configure --enable-shared --prefix=/usr
|
||||
|
||||
# If we got this far, all prerequisite libraries must be here.
|
||||
make
|
||||
|
||||
%install
|
||||
# Make sure the RPM_BUILD_ROOT directory exists.
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
make BUILDROOT=$RPM_BUILD_ROOT install
|
||||
|
||||
%clean
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
%files
|
||||
%defattr(-,root,root)
|
||||
|
||||
%dir /usr/bin
|
||||
/usr/bin/*
|
||||
%dir /usr/include
|
||||
/usr/include/mxml.h
|
||||
%dir /usr/lib
|
||||
/usr/lib/*
|
||||
%dir /usr/lib/pkgconfig
|
||||
/usr/lib/pkgconfig/mxml.pc
|
||||
%dir /usr/share/doc/mxml
|
||||
/usr/share/doc/mxml/*
|
||||
%dir /usr/share/man/cat1
|
||||
/usr/share/man/cat1/*
|
||||
%dir /usr/share/man/cat3
|
||||
/usr/share/man/cat3/*
|
||||
%dir /usr/share/man/man1
|
||||
/usr/share/man/man1/*
|
||||
%dir /usr/share/man/man3
|
||||
/usr/share/man/man3/*
|
||||
|
||||
#
|
||||
# End of "$Id$".
|
||||
#
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<group>
|
||||
<option>
|
||||
<keyword type="opaque">InputSlot</keyword>
|
||||
<default type="opaque">Auto</default>
|
||||
<text>Media Source</text>
|
||||
<order type="real">10.000000</order>
|
||||
<choice>
|
||||
<keyword type="opaque">Auto</keyword>
|
||||
<text>Auto Tray Selection</text>
|
||||
<code type="opaque" />
|
||||
</choice>
|
||||
<choice>
|
||||
<keyword type="opaque">Upper</keyword>
|
||||
<text>Tray 1</text>
|
||||
<code type="opaque"><</MediaPosition 0>>setpagedevice</code>
|
||||
</choice>
|
||||
<choice>
|
||||
<keyword type="opaque">Lower</keyword>
|
||||
<text>Tray 2</text>
|
||||
<code type="opaque"><</MediaPosition 1>>setpagedevice</code>
|
||||
</choice>
|
||||
</option>
|
||||
<integer>123</integer>
|
||||
<string>Now is the time for all good men to come to the aid of their
|
||||
country.</string>
|
||||
<!-- this is a comment -->
|
||||
<![CDATA[this is CDATA 0123456789ABCDEF]]>
|
||||
</group>
|
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<group>
|
||||
<option>
|
||||
<keyword type="opaque">InputSlot</keyword>
|
||||
<default type="opaque">Auto</default>
|
||||
<text>Media Source</text>
|
||||
<order type="real">10.000000</order>
|
||||
<choice>
|
||||
<keyword type="opaque">Auto</keyword>
|
||||
<text>Auto Tray Selection</text>
|
||||
<code type="opaque" />
|
||||
</choice>
|
||||
<choice>
|
||||
<keyword type="opaque">Upper</keyword>
|
||||
<text>Tray 1</text>
|
||||
<code type="opaque"><</MediaPosition 0>>setpagedevice</code>
|
||||
</choice>
|
||||
<choice>
|
||||
<keyword type="opaque">Lower</keyword>
|
||||
<text>Tray 2</text>
|
||||
<code type="opaque"><</MediaPosition 1>>setpagedevice</code>
|
||||
</choice>
|
||||
</option>
|
||||
<integer>123</integer>
|
||||
<string>Now is the time for all good men to come to the aid of their
|
||||
country.</string>
|
||||
<!-- this is a comment -->
|
||||
<![CDATA[this is CDATA 0123456789ABCDEF]]>
|
||||
</group>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue