commit c3b542d8c54856d751a03f96ccd65a816b64625e Author: Laurence Withers Date: Sat Oct 13 18:15:32 2007 +0000 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d025740 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +obj +html diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d28d2c7 --- /dev/null +++ b/COPYING @@ -0,0 +1,278 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 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. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +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 software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, 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 redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +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 Program or any portion +of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +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 Program, 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 Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) 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; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, 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 executable. 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. + +If distribution of executable or 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 counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program 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. + + 5. 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 Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program 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. + + 7. 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 Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program 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 Program. + +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. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program 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. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies 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 Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, 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 + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. 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 PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. diff --git a/README b/README new file mode 100644 index 0000000..fde4d90 --- /dev/null +++ b/README @@ -0,0 +1,17 @@ +liblwevent +======================================================================== +(c)2007, Laurence Withers, . +Released under the GNU GPLv2. See file COPYING or +http://www.gnu.org/copyleft/gpl.html for details. + +Really Quick Instructions +------------------------- + +To build: ./make.sh +To install: ./make.sh install + +You might want to edit 'config' first. You might also want to set +'INSTALL_PREFIX', which is prepended onto the destination of any +installed file. + +@TODO@ diff --git a/config b/config new file mode 100644 index 0000000..161a967 --- /dev/null +++ b/config @@ -0,0 +1,36 @@ +# liblwevent/config +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: syntax=sh:expandtab:ts=4:sw=4 +# +# (c)2007, Laurence Withers, . +# Released under the GNU GPLv2. See file COPYING or +# http://www.gnu.org/copyleft/gpl.html for details. +# +# This file contains options used to build liblwevent. + + +# PREFIX is the most important option. Many other paths are derived from it, as follows: +# +# PREFIX | / | /usr | /usr/local | /opt/* +# ------------+-------------------+-------------------+-------------------+----------------- +# BINDIR | /bin | /usr/bin | /usr/local/bin | /opt/*/bin +# SBINDIR | /sbin | /usr/sbin | /usr/local/sbin | /opt/*/sbin +# LIBDIR | /lib | /usr/lib | /usr/local/lib | /opt/*/lib +# INCLUDEDIR | /usr/include | /usr/include | /usr/local/include| /opt/*/include +# CONFIGDIR | /etc | /etc | /usr/local/etc | /etc/opt/* +# VARDIR | /var | /var | /var | /var/opt/* +# SHAREDIR | /usr/share | /usr/share | /usr/local/share | /opt/*/share +# DOCSDIR | /usr/share/doc | /usr/share/doc | /usr/local/share/doc, /opt/*/doc +# WEBDIR | /srv/http | /srv/http | /srv/http | /opt/*/http +# +# Specific notes: +# When installing, all paths are prepended with INSTALL_PREFIX. +# Any parameter can be overridden by setting an environment variable. +# CGIDIR is set to ${WEBDIR}/cgi-bin . +# +[ -z "${PREFIX}" ] && PREFIX="/usr/local" +source "scripts/paths" + +# Project-specific variables below. +[ -z "${CC}" ] && CC="gcc" +[ -z "${CFLAGS}" ] && CFLAGS="-g -O2 -W -Wall" diff --git a/make.sh b/make.sh new file mode 100755 index 0000000..f8432c7 --- /dev/null +++ b/make.sh @@ -0,0 +1,296 @@ +#!/bin/sh +# liblwevent/make.sh +# +# (c)2006-2007, Laurence Withers, . +# Released under the GNU GPLv2. See file COPYING or +# http://www.gnu.org/copyleft/gpl.html for details. +# + + +# This file is the script used to build liblwevent. There are some +# options that can be edited; these are set in the file 'config' (or you +# can pass them in as environment variables). +if [ ! -e "config" ] +then + echo "Configuration file not found???" + exit 1 +fi +source "config" # don't fail on error, since last command in config might return false + + + +# Get version information +source version || exit 1 +VERSION="${VERMAJOR}.${VERMINOR}.${VERMICRO}" + + + +# Get standard functions +[ -z "${VERBOSE}" ] && VERBOSE="0" +source scripts/functions.sh || exit 1 + + +# List of directories which will be emptied by clean. +OUTPUT_DIRS="obj html" + + + +# This function makes a monolithic file out of several source files. Its +# first argument is the name of the output file, and the second is the +# format of monolithic file to create (for example, "C" will cause the +# inclusion of "#line" directives at the top of each included file). +# +# It also examines the following variables: +# MONOLITHIC_TESTS if any file mentioned in this list is newer +# than the output file, then we recreate it +# MONOLITHIC_SOURCE a list (in order) of the source files +# MONOLITHIC_OPTIONS will #define the options to match the respective +# environment variables. +# +# Recognised formats are: +# none no special processing happens before each file +# C #line directives are inserted before each file +# and VERSION, VERMAJOR etc. are #defined +# Ch Like C, but for header files (no VERSION #defines) +# +make_monolithic() { + if [ $# -ne 2 ] + then + print_failure "make_monolithic() called with wrong number of arguments" + print_failure "(expecting 2, got $#)" + return 1 + fi + + MONOLITHIC_OUT=$1 + + # extract options + HASHLINE=0 + VERDEFINE=0 + HASHDEFINE=0 + if [ "$2" == "C" ] + then + HASHLINE=1 + VERDEFINE=1 + HASHDEFINE=1 + elif [ "$2" == "Ch" ] + then + HASHLINE=1 + HASHDEFINE=1 + elif [ "$2" == "none" ] + then + HASHLINE=0 # dummy command + else + print_failure "make_monolithic() called with unknown format $2" + return 1 + fi + + echo " Building monolithic file '${MONOLITHIC_OUT}'..." + + MODIFIED=0 + for FILE in ${MONOLITHIC_TESTS} ${MONOLITHIC_SOURCE} + do + if [ ! -e "${FILE}" ] + then + print_failure "'${FILE}' does not exist" + return 1 + fi + + if [ "${FILE}" -nt ${MONOLITHIC_OUT} ] + then + MODIFIED=1 + break + fi + done + + if [ ${MODIFIED} -ne 0 ] + then + do_cmd mkdir -p $(dirname ${MONOLITHIC_OUT}) + do_cmd rm -f ${MONOLITHIC_OUT} || exit 1 + + if [ ${VERDEFINE} -ne 0 ] + then + do_cmd_redir ${MONOLITHIC_OUT} echo "#define VERSION \"${VERSION}\"" || return 1 + do_cmd_redir ${MONOLITHIC_OUT} echo "#define VERMAJOR ${VERMAJOR}" || return 1 + do_cmd_redir ${MONOLITHIC_OUT} echo "#define VERMINOR ${VERMINOR}" || return 1 + do_cmd_redir ${MONOLITHIC_OUT} echo "#define VERMICRO ${VERMICRO}" || return 1 + do_cmd_redir ${MONOLITHIC_OUT} echo "#define VEREXTRA \"${VEREXTRA}\"" || return 1 + fi + + if [ ${HASHDEFINE} -ne 0 ] + then + for opt in ${MONOLITHIC_OPTIONS} + do + do_cmd_redir ${MONOLITHIC_OUT} echo "#define ${opt} ${!opt}" || return 1 + done + fi + + for FILE in ${MONOLITHIC_SOURCE} + do + if [ ${HASHLINE} -ne 0 ] + then + do_cmd_redir ${MONOLITHIC_OUT} echo "#line 1 \"${FILE}\"" || return 1 + fi + do_cmd_redir ${MONOLITHIC_OUT} cat "${FILE}" || return 1 + done + print_success "Done" + else + print_success "Up to date" + fi +} + + + +# This will build a directory tree, if required, with mode 0755. The +# argument is the directory to build. +build_dir_tree() { + # sanity check + if [ $# -ne 1 ] + then + print_failure "build_dir_tree() called with wrong number of arguments" + print_failure "(expecting 1, got $#)" + return 1 + fi + + build_dir_tree_recurse "${INSTALL_PREFIX}$1" +} + +build_dir_tree_recurse() { + local DIR="$1" + + # if the directory already exists, return success + [ -d "${DIR}" ] && return 0 + + # if something with this name already exists, but not a directory, + # then fail + if [ -e "${DIR}" ] + then + print_failure "Failed to create directory '${DIR}'" + return 1 + fi + + # build the directory, but if it fails, recurse a level (and handle + # the case where recursion fails) + mkdir "${DIR}" >& /dev/null + if [ $? -ne 0 ] + then + build_dir_tree_recurse $(dirname "${DIR}") || return 1 + echo " Creating directory '${DIR}'" + do_cmd mkdir "${DIR}" + if [ $? -ne 0 ] + then + print_failure "Failed to create directory '${DIR}'" + return 1 + fi + fi + + # set permissions on newly-created dir and return + chmod 0755 "${DIR}" + return 0 +} + + + +# This will install a file. The first parameter is the source, and the +# second is the destination. The third is the octal mode. +install_file() { + # figure out if $2 is a directory or not + DEST_FILE="${INSTALL_PREFIX}$2" + [ -d "${DEST_FILE}" ] && DEST_FILE="${INSTALL_PREFIX}$2/$(basename $1)" + + echo " Installing: '$1' -> '${DEST_FILE}'" + do_cmd cp -fP "$1" "${DEST_FILE}" || return 1 + do_cmd chmod "$3" "${DEST_FILE}" || return 1 + + return 0 +} + + + +# This will install a header file. It is basically similar to +# install_file(), only we strip out the #line directives. +install_header() { + DEST_FILE="${INSTALL_PREFIX}$2" + [ -d "${DEST_FILE}" ] && DEST_FILE="${INSTALL_PREFIX}$2/$(basename $1)" + + echo " Installing: '$1' -> '${DEST_FILE}'" + do_cmd rm -f ${DEST_FILE} || exit 1 + do_cmd_redir ${DEST_FILE} sed -e "s,^#line.*,," $1 || exit 1 + do_cmd chmod "$3" "${DEST_FILE}" || return 1 + + return 0 +} + + + +# This installs a symlink. The first argument is the symlink's name; the +# second the symlink's source filename, and the third is the directory +# in which to create the symlink. +install_symlink() { + echo " Installing symlink: '${INSTALL_PREFIX}$3/$1' -> '$2'" + + ( do_cmd ln -sf $2 ${INSTALL_PREFIX}$3/$1 ) || return 1 + + return 0 +} + + + +build_target() { + ITEMS="src/$1/build.default" + if [ ! -e "${ITEMS}" ] + then + ITEMS="$(find src -type f -name build.$1)" + fi + + if [ -z "${ITEMS}" ] + then + print_failure "Unrecognised target '$1'" + return 1 + fi + + for item in ${ITEMS} + do + do_cmd source ${item} || exit 1 + done + return 0 +} + + + +######################################################################## +# Main script +######################################################################## + +if [ $# -eq 0 ] +then + targets="default" +else + targets="$@" +fi + +for func in ${targets} +do + case ${func} in + clean) + echo "Cleaning..." + rm -rf ${OUTPUT_DIRS} + print_success "Done" + true + ;; + + # bad Kdevelop! bad! + -j1) + ;; + -k) + ;; + + *) + build_target ${func} || exit 1 + ;; + esac +done + +exit 0 + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: expandtab:ts=4:sw=4 diff --git a/run-test.sh b/run-test.sh new file mode 100755 index 0000000..ced685d --- /dev/null +++ b/run-test.sh @@ -0,0 +1,54 @@ +#!/bin/sh +# liblwevent/test.sh +# +# (c)2006, Laurence Withers, . +# Released under the GNU GPLv2. See file COPYING or +# http://www.gnu.org/copyleft/gpl.html for details. +# + +# Running this script on its own will display a summary of all the +# available tests; running it with arguments runs the relevant test. + + + +# This runs a test, setting the correct library path. +run_test() { + EXE=obj/tests/$1 + shift + if [ ! -x ${EXE} ] + then + echo "No such test '${EXE}'" + return 1 + fi + + LD_LIBRARY_PATH="obj" ${EXE} "$@" || return 1 + return 0 +} + + + +# This prints summary output from each test app. +print_tests() { + echo "Available tests" + echo "---------------------------------------------------------------------" + for EXE in obj/tests/* + do + [ -x ${EXE} ] || continue + NAME=$(echo ${EXE} | sed 's,obj/tests/,,') + echo -ne "${NAME}\t" + LD_LIBRARY_PATH="obj" ${EXE} --print-summary + done +} + + +# Main script +if [ $# -eq 0 ] +then + print_tests + exit 0 +fi + +run_test $* + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: expandtab:ts=4:sw=4 diff --git a/scripts/.gitignore b/scripts/.gitignore new file mode 100644 index 0000000..edcbbeb --- /dev/null +++ b/scripts/.gitignore @@ -0,0 +1,20 @@ +build.app.c +build.app.c++ +build.app.c++-qt +build.app.sh +build.docs.doxygen +build.docs.none +build.files.none +build.firmware.gpasm +build.firmware.sdcc +build.lib.c +build.lib.c++ +build.make.none +build.module.c +build.tests.c +build.tests.c++ + +config-printflags.sh +module-create.sh +release.sh +version.sh diff --git a/scripts/functions.sh b/scripts/functions.sh new file mode 100644 index 0000000..a23dcb3 --- /dev/null +++ b/scripts/functions.sh @@ -0,0 +1,67 @@ +# liblwevent/scripts/functions.sh +# +# (c)2006, Laurence Withers, . +# Released under the GNU GPLv2. See file COPYING or +# http://www.gnu.org/copyleft/gpl.html for details. +# + +# Common functions + + + +# Print a success message +print_success() { + if [ -z "${TERM}" -o "${TERM}" == "dumb" ] + then + echo -n " - " + else + (echo -n -e " \E[32m* "; tput sgr0) + fi + echo $* +} + + + +# Print a failure message +print_failure() { + if [ -z "${TERM}" -o "${TERM}" == "dumb" ] + then + echo -n " *** " + else + (echo -n -e " \E[31m*** "; tput sgr0) + fi + echo $* +} + + + +# This function carries out a command, but reports its failure if +# necessary. +do_cmd() { + [ "${VERBOSE}" != "0" ] && echo "$@" + "$@" + if [ $? -ne 0 ] + then + print_failure "'$@' failed." + return 1 + fi +} + + + +# This function carries out a command, but reports its failure if +# necessary. +do_cmd_redir() { + DEST=$1 + shift + [ "${VERBOSE}" != "0" ] && echo "$@ >> ${DEST}" + "$@" >> ${DEST} + if [ $? -ne 0 ] + then + print_failure "'$@' failed." + return 1 + fi +} + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: expandtab:ts=4:sw=4 diff --git a/scripts/paths b/scripts/paths new file mode 100644 index 0000000..a1a47b8 --- /dev/null +++ b/scripts/paths @@ -0,0 +1,81 @@ +# liblwevent/scripts/paths +# vim: syntax=sh:sw=4:ts=4:expandtab +# +# Default path setup. Not meant for editing; use environment variables +# to override values if needed. +# + +# build proposed paths +case "${PREFIX}" in +/) + MY_BINDIR="/bin" + MY_SBINDIR="/sbin" + MY_LIBDIR="/lib" + MY_INCLUDEDIR="/usr/include" + MY_CONFIGDIR="/etc" + MY_VARDIR="/var" + MY_SHAREDIR="/usr/share/liblwevent" + MY_DOCSDIR="/usr/share/doc/liblwevent" + MY_WEBDIR="/srv/http" + ;; + +/usr) + MY_BINDIR="/usr/bin" + MY_SBINDIR="/usr/sbin" + MY_LIBDIR="/usr/lib" + MY_INCLUDEDIR="/usr/include" + MY_CONFIGDIR="/etc" + MY_VARDIR="/var" + MY_SHAREDIR="/usr/share/liblwevent" + MY_DOCSDIR="/usr/share/doc/liblwevent" + MY_WEBDIR="/srv/http" + ;; + +/usr/local) + MY_BINDIR="/usr/local/bin" + MY_SBINDIR="/usr/local/sbin" + MY_LIBDIR="/usr/local/lib" + MY_INCLUDEDIR="/usr/local/include" + MY_CONFIGDIR="/usr/local/etc" + MY_VARDIR="/var" + MY_SHAREDIR="/usr/local/share/liblwevent" + MY_DOCSDIR="/usr/local/share/doc/liblwevent" + MY_WEBDIR="/srv/http" + ;; + +/opt/*) + MY_BINDIR="${PREFIX}/bin" + MY_SBINDIR="${PREFIX}/sbin" + MY_LIBDIR="${PREFIX}/lib" + MY_INCLUDEDIR="${PREFIX}/include" + MY_CONFIGDIR="/etc${PREFIX}" + MY_VARDIR="/var${PREFIX}" + MY_SHAREDIR="/var${PREFIX}" + MY_DOCSDIR="${PREFIX}/doc" + MY_WEBDIR="${PREFIX}/http" + ;; + +**) + MY_BINDIR="${PREFIX}/bin" + MY_SBINDIR="${PREFIX}/sbin" + MY_LIBDIR="${PREFIX}/lib" + MY_INCLUDEDIR="${PREFIX}/include" + MY_CONFIGDIR="${PREFIX}/etc" + MY_VARDIR="${PREFIX}/var" + MY_DOCSDIR="${PREFIX}/share/doc" + MY_WEBDIR="${PREFIX}/srv/http" + ;; +esac + +MY_CGIDIR="${WEBDIR}/cgi-bin" + +# assign paths allowing user to override +[ -z "${BINDIR}" ] && BINDIR="${MY_BINDIR}" +[ -z "${SBINDIR}" ] && SBINDIR="${MY_SBINDIR}" +[ -z "${LIBDIR}" ] && LIBDIR="${MY_LIBDIR}" +[ -z "${INCLUDEDIR}" ] && INCLUDEDIR="${MY_INCLUDEDIR}" +[ -z "${CONFIGDIR}" ] && CONFIGDIR="${MY_CONFIGDIR}" +[ -z "${VARDIR}" ] && VARDIR="${MY_VARDIR}" +[ -z "${DOCSDIR}" ] && DOCSDIR="${MY_DOCSDIR}" +[ -z "${WEBDIR}" ] && WEBDIR="${MY_WEBDIR}" +[ -z "${CGIDIR}" ] && CGIDIR="${MY_CGIDIR}" diff --git a/src/docs/.params b/src/docs/.params new file mode 100644 index 0000000..30ca609 --- /dev/null +++ b/src/docs/.params @@ -0,0 +1 @@ +docs doxygen docs diff --git a/src/docs/Doxyfile.in b/src/docs/Doxyfile.in new file mode 100644 index 0000000..7d3b3a6 --- /dev/null +++ b/src/docs/Doxyfile.in @@ -0,0 +1,179 @@ +# liblwevent/src/docs/Doxyfile.in +# +# (c)2007, Laurence Withers, . +# Released under the GNU GPLv2. See file COPYING or +# http://www.gnu.org/copyleft/gpl.html for details. +# + +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = liblwevent +OUTPUT_DIRECTORY = +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = YES +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = YES +DETAILS_AT_TOP = YES +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 4 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = NO +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = YES +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = NO +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = NO +SHOW_DIRECTORIES = NO +FILE_VERSION_FILTER = +QUIET = YES +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = YES +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = +RECURSIVE = NO +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = src/docs +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +REFERENCES_LINK_SOURCE = YES +USE_HTAGS = NO +VERBATIM_HEADERS = NO +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +GENERATE_AUTOGEN_DEF = NO +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = DOXYGEN +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +CLASS_DIAGRAMS = YES +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = NO +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = NO +INCLUDED_BY_GRAPH = NO +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = NO +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +DOT_TRANSPARENT = YES +DOT_MULTI_TARGETS = YES +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +SEARCHENGINE = NO diff --git a/src/docs/MainPage.dox b/src/docs/MainPage.dox new file mode 100644 index 0000000..f9d16de --- /dev/null +++ b/src/docs/MainPage.dox @@ -0,0 +1,30 @@ +/* liblwevent/src/docs/MainPage.dox + * + * (c)2007, Laurence Withers, . + * Released under the GNU GPLv2. See file COPYING or + * http://www.gnu.org/copyleft/gpl.html for details. +*/ + +/*! \mainpage Lightweight Event Library + +This library is a lightweight wrapper around the \c epoll(7) facility. Its purpose is to provide a +slightly higher level interface for simplicity and speed of development. Effectively, it provides an +API consisting of the common operations used by programs written using an event-driven, finite state +machine (or other object-based) paradigm. + +Its features are as follows: + \li simple event loop interface (see section \ref eventloop) + \li wrapper functions for adding and removing file descriptors (see section \ref fdevent) + \li signal functions (TODO) + \li timer functions (TODO) + \li safe inter-object actions (one object may free another at any time) + \li O(1) design to match that of \c epoll(7) + +See the page \ref libdesign for detailed information on the implementation. + +*/ + +/* options for text editors +kate: replace-trailing-space-save true; space-indent true; tab-width 4; +vim: expandtab:ts=4:sw=4:syntax=doxygen +*/ diff --git a/src/docs/build.default b/src/docs/build.default new file mode 100644 index 0000000..ca22639 --- /dev/null +++ b/src/docs/build.default @@ -0,0 +1 @@ +source src/docs/build.docs diff --git a/src/docs/build.docs b/src/docs/build.docs new file mode 100644 index 0000000..98d0570 --- /dev/null +++ b/src/docs/build.docs @@ -0,0 +1,43 @@ +# These are external variables, and shouldn't clash with anything else +# docs_BUILT +# + +MONOLITHIC_DOC="${MONOLITHIC_DOC} $(echo src/docs/*.dox)" +build_target monolithic + +if [ -z ${docs_BUILT} ] +then + echo "Building documentation with Doxygen..." + + DOXYFILE=obj/Doxyfile.docs + + if [ ! -e ${DOXYFILE} ] + then + do_cmd cp src/docs/Doxyfile.in ${DOXYFILE} || return 1 + echo "INPUT = ${MONOLITHIC_DOC}" >> ${DOXYFILE} + echo "PROJECT_NUMBER = ${VERSION}" >> ${DOXYFILE} + fi + + MODIFIED=0 + for file in ${MONOLITHIC_DOC} + do + if [ ${file} -nt html/index.html ] + then + MODIFIED=1 + break + fi + done + + if [ ${MODIFIED} -ne 0 ] + then + do_cmd doxygen ${DOXYFILE} || return 1 + print_success "Documentation built" + else + print_success "Documentation is up to date" + fi + + docs_BUILT=1 +fi + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: syntax=sh:expandtab:ts=4:sw=4 diff --git a/src/docs/build.install b/src/docs/build.install new file mode 100644 index 0000000..016c75c --- /dev/null +++ b/src/docs/build.install @@ -0,0 +1 @@ +source src/docs/build.install-docs diff --git a/src/docs/build.install-docs b/src/docs/build.install-docs new file mode 100644 index 0000000..28f5f18 --- /dev/null +++ b/src/docs/build.install-docs @@ -0,0 +1,21 @@ +build_target docs + +# create documentation directories +echo "Installing documentation into ${DOCSDIR}" +build_dir_tree "${DOCSDIR}/html" || return 1 + +# copy across the Doxygen-generated documentation +for file in html/* +do + install_file ${file} ${DOCSDIR}/html 0644 || return 1 +done + +# copy across the generic files +for file in COPYING README +do + install_file ${file} ${DOCSDIR} 0644 || return 1 +done + +print_success "Documentation installed" +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: syntax=sh:expandtab:ts=4:sw=4 diff --git a/src/docs/libdesign.dox b/src/docs/libdesign.dox new file mode 100644 index 0000000..6999820 --- /dev/null +++ b/src/docs/libdesign.dox @@ -0,0 +1,49 @@ +/* liblwevent/src/docs/libdesign.dox + * + * (c)2007, Laurence Withers, . + * Released under the GNU GPLv2. See file COPYING or + * http://www.gnu.org/copyleft/gpl.html for details. +*/ + +/*! \page libdesign Library design + +\section libdesign_O1 O(1) design + +Like the \c epoll(7) facility, \a liblwevent is designed to be O(1): execution time does not scale +with number of active file descriptors, and is instead constant (per event). Effectively, this means +that the library \em never stores or scans a list of active objects; instead, objects are associated +solely with file descriptors, and the kernel maintains this association in its file descriptor +table. + +As a consequence, the library does not have information about which (if any) objects are active. It +cannot be used to directly implement per-object timeouts, since there would be no way of determining +which objects to scan when computing what the timeouts should be, and no way of knowing which +objects did not receive events after a call to \c epoll_wait(2). + +\section libdesign_interobject Inter-object actions + +Unlike \a libevent (see \c event(3)), liblwevent directly supports safe inter-object actions. This +means that one object can safely free (or modify) another, at any time, without fear of crashing. + +Consider an event loop watching two objects, A and B. When either object's file descriptor is +closed, the other object should be freed. Now imagine that the remote side of B is shut down and, +before the kernel schedules in the event loop's process, A becomes ready for reading. The kernel, +unaware of the semantics of the link between these two objects, will return two events: \c EPOLLHUP +for B, and EPOLLIN for A. The process is scheduled in, and processes B's event first. It closes the +file descriptor associated with A and destroys the associated user-space information (write buffers +etc.). But then it comes to process the event for A, which is now invalid, and has dangling pointers. + +\a liblwevent provides a mechanism for dealing with this sequence of events. Each object has an +\em invalid flag, normally cleared. When B destroys the information associated with A, the struct +lwevent object associated with A persists with its invalid flag set, and a pointer to it is placed +onto a list. When the event for A is processed, \a liblwevent notices the invalid flag and skips the +event. When all events have been processed, the library iterates through the list of invalid events +and frees the remaining objects. This ensures robust operation regardless of the order in which +events occur. + +*/ + +/* options for text editors +kate: replace-trailing-space-save true; space-indent true; tab-width 4; +vim: expandtab:ts=4:sw=4:syntax=doxygen +*/ diff --git a/src/libgslevent/.params b/src/libgslevent/.params new file mode 100644 index 0000000..47f97c9 --- /dev/null +++ b/src/libgslevent/.params @@ -0,0 +1 @@ +lib c liblwevent lwevent.h diff --git a/src/libgslevent/000_TopHeader.h b/src/libgslevent/000_TopHeader.h new file mode 100644 index 0000000..baca26e --- /dev/null +++ b/src/libgslevent/000_TopHeader.h @@ -0,0 +1,16 @@ +/* liblwevent/src/liblwevent/000_TopHeader.h + * + * (c)2007, Laurence Withers, . + * Released under the GNU GPLv2. See file COPYING or + * http://www.gnu.org/copyleft/gpl.html for details. +*/ + +#ifndef HEADER_liblwevent +#define HEADER_liblwevent + +/* standard includes, or includes needed for type declarations */ + +/* options for text editors +kate: replace-trailing-space-save true; space-indent true; tab-width 4; +vim: expandtab:ts=4:sw=4:syntax=c.doxygen +*/ diff --git a/src/libgslevent/000_TopSource.c b/src/libgslevent/000_TopSource.c new file mode 100644 index 0000000..5d124da --- /dev/null +++ b/src/libgslevent/000_TopSource.c @@ -0,0 +1,15 @@ +/* liblwevent/src/liblwevent/000_TopSource.c + * + * (c)2007, Laurence Withers, . + * Released under the GNU GPLv2. See file COPYING or + * http://www.gnu.org/copyleft/gpl.html for details. +*/ + +#include "lwevent.h" + +/* Below are all the includes used throughout the library. */ + +/* options for text editors +kate: replace-trailing-space-save true; space-indent true; tab-width 4; +vim: expandtab:ts=4:sw=4 +*/ diff --git a/src/libgslevent/200_eventloop.h b/src/libgslevent/200_eventloop.h new file mode 100644 index 0000000..3bcefb0 --- /dev/null +++ b/src/libgslevent/200_eventloop.h @@ -0,0 +1,67 @@ +/* liblwevent/src/liblwevent/200_eventloop.h + * + * (c)2007, Laurence Withers, . + * Released under the GNU GPLv2. See file COPYING or + * http://www.gnu.org/copyleft/gpl.html for details. +*/ + + + +/*! \defgroup eventloop Main event loop + +This module controls overall program flow. The two main functions of interest are +lwevent_loop(), which implements a full event-driven programming loop (only returning when the +program should exit), and lwevent_wait(), which implements a single run of the event loop. + +*/ +/*!@{*/ + + + +/*! \brief Event loop exit flag. + +This flag, if set, signifies that lwevent_loop() should exit after its next iteration. It can be +set by a signal handler or any other function in the program at any time. It is scanned after each +loop is completely processed. + +*/ +extern volatile int lwevent_loop_exit; + + + +/*! \brief Event loop (loop forever). + +\retval 0 on success (event loop exited due to lwevent_loop_exit flag). +\retval -1 on error (system call failed; see \a errno). + +This function will call lwevent_wait() in a loop forever. The loop can be aborted by setting the +flag lwevent_loop_exit to non-zero. The loop will also be aborted if lwevent_wait() returns an +error (in which case \a errno can be used to determine the error). + +*/ +int lwevent_loop(void); + + + +/*! \brief Event loop (loop once). + +\param timeout_ms A timeout, in milliseconds. This function will return as soon as any events occur, + but will return after \a timeout_ms milliseconds have elapsed. +\retval 0 on success (events occurred, timeout occurred). +\retval -1 on error (system call failed; see \a errno). + +This function will run the event loop once, returning as soon as events are available (or the +timeout, in milliseconds, occurs). If any events do occur, they will be dispatched to the relevant +callback objects. The final action of this function is to free the memory associated with any +objects that are closed during the callbacks. + +*/ +int lwevent_wait(int timeout_ms); + + + +/*!@}*/ +/* options for text editors +kate: replace-trailing-space-save true; space-indent true; tab-width 4; +vim: expandtab:ts=4:sw=4:syntax=c.doxygen +*/ diff --git a/src/libgslevent/300_fdevent.h b/src/libgslevent/300_fdevent.h new file mode 100644 index 0000000..0e71f9d --- /dev/null +++ b/src/libgslevent/300_fdevent.h @@ -0,0 +1,111 @@ +/* liblwevent/src/liblwevent/300_fdevent.h + * + * (c)2007, Laurence Withers, . + * Released under the GNU GPLv2. See file COPYING or + * http://www.gnu.org/copyleft/gpl.html for details. +*/ + + + +/*! \defgroup fdevent File descriptor event management + +This module contains functions for managing file descriptor-based events. For each file descriptor +to be monitored, a struct lwevent is instantiated with lwevent_new(). This opaque object contains +all the details needed to provide callbacks when events occur (see section \ref fdparams for more +information). + +*/ +/*!@{*/ + + + +/*! \brief Opaque file descriptor event structure. + +This structure is associated with a single file descriptor. It holds the details used to +implement callbacks whenever the file descriptor is ready for I/O. The structure cannot be +dereferenced; instead, the functions used in the section \ref fdparams can be used to store or +retrieve associated values. + +*/ +struct lwevent +#ifndef DOXYGEN +; +#else +{ + /*! \brief Dummy variable for doxygen */ + int dummy; +}; +#endif + + + +/*! \brief Event callback function pointer. + +\param ev Pointer to event structure. +\param revents Bitmask of returned events (see \c epoll(7)). + +This is the type of function pointer used for event callbacks. The event callback function will be +called from lwevent_wait() or lwevent_loop() with a pointer to the associated event structure and +a bitmask of events which have occurred. + +*/ +typedef void (*lwevent_callback)(struct lwevent* ev, int revents); + + + +/*! \brief Create new event structure associated with a file descriptor. + +\param fd File descriptor to monitor. +\param events Bitmask of events to watch for, and epoll flags (see \c epoll(7)). +\param callback Pointer to function to call whenever an event occurs. +\returns Pointer to new lwevent structure on success. +\retval 0 on error (and see \a errno). + +This function will create and register with \c epoll(7) a lwevent structure associated with the +file descriptor \a fd. Initially, the object will have the callback function specified in +\a callback, but this (and other attributes) can be changed; see section \ref fdparams. + +Once a lwevent structure has been created for \a fd, \a fd should not be passed to \c close(2) +directly. Instead, when it is time to close the file descriptor, pass the associated lwevent +structure to lwevent_free(). + +*/ +struct lwevent* lwevent_new(int fd, int events, lwevent_callback callback); + + + +/*! \brief Free an event structure and close its associated file descriptor. + +\param ev Event structure. May be 0. + +This function will close the file descriptor associated with \a ev, call the destructor if one is +registered (see section \ref fdparams), and free the memory used by \a ev. It may be called at any +time in the event loop. If called with a null argument, it is a no-op. + +Whenever this function is called, the object \a ev is marked as invalid. If it has already been +marked as invalid, the function is a no-op. Otherwise, the file descriptor is immediately closed +with \c close(2), and the destructor is also called. The object \a ev itself is not actually freed +at this point; it is placed onto a list of invalid objects, and is only freed at the very end of a +call to lwevent_wait(). + +This behaviour is what allows an object to be freed at any time without fear of crashing. If two +events are returned from lwevent_wait(), and the callback of the first event calls lwevent_free() +on the second event's object, the second callback can be aborted (since the event object will still +exist, but is marked as invalid). Further objects may call lwevent_free() on the invalid object +without consequence. At the end of the event loop, once no more callbacks are queued, the invalid +objects are freed. This means that you cannot continue to refer to invalid objects after a completed +call to lwevent_wait(). + +*/ +void lwevent_free(struct lwevent* ev); + +int lwevent_deactivate(struct lwevent* ev); +int lwevent_reactivate(struct lwevent* ev); + + + +/*!@}*/ +/* options for text editors +kate: replace-trailing-space-save true; space-indent true; tab-width 4; +vim: expandtab:ts=4:sw=4:syntax=c.doxygen +*/ diff --git a/src/libgslevent/350_fdparams.h b/src/libgslevent/350_fdparams.h new file mode 100644 index 0000000..d8b7345 --- /dev/null +++ b/src/libgslevent/350_fdparams.h @@ -0,0 +1,30 @@ +/* liblwevent/src/liblwevent/300_fdevent.h + * + * (c)2007, Laurence Withers, . + * Released under the GNU GPLv2. See file COPYING or + * http://www.gnu.org/copyleft/gpl.html for details. +*/ + + + +int lwevent_get_fd(const struct lwevent* ev); + +int lwevent_set_events(struct lwevent* ev, int events, int* old_events); +int lwevent_get_events(const struct lwevent* ev); + +void lwevent_set_callback(struct lwevent* ev, lwevent_callback callback, + lwevent_callback* old_callback); +lwevent_callback lwevent_get_callback(const struct lwevent* ev); + +void lwevent_set_user(struct lwevent* ev, void* user); +void* lwevent_get_user(const struct lwevent* ev); + +typedef void (*lwevent_dtor)(struct lwevent* ev); +void lwevent_set_dtor(struct lwevent* ev, lwevent_dtor dtor, lwevent_dtor* old_dtor); +lwevent_dtor lwevent_get_dtor(struct lwevent* ev); + + +/* options for text editors +kate: replace-trailing-space-save true; space-indent true; tab-width 4; +vim: expandtab:ts=4:sw=4:syntax=c.doxygen +*/ diff --git a/src/libgslevent/999_BottomHeader.h b/src/libgslevent/999_BottomHeader.h new file mode 100644 index 0000000..932867d --- /dev/null +++ b/src/libgslevent/999_BottomHeader.h @@ -0,0 +1,13 @@ +/* liblwevent/src/liblwevent/999_BottomHeader.h + * + * (c)2007, Laurence Withers, . + * Released under the GNU GPLv2. See file COPYING or + * http://www.gnu.org/copyleft/gpl.html for details. +*/ + +#endif + +/* options for text editors +kate: replace-trailing-space-save true; space-indent true; tab-width 4; +vim: expandtab:ts=4:sw=4:syntax=c.doxygen +*/ diff --git a/src/libgslevent/build.default b/src/libgslevent/build.default new file mode 100644 index 0000000..46b1fac --- /dev/null +++ b/src/libgslevent/build.default @@ -0,0 +1 @@ +source src/liblwevent/build.lib diff --git a/src/libgslevent/build.install b/src/libgslevent/build.install new file mode 100644 index 0000000..4a94b95 --- /dev/null +++ b/src/libgslevent/build.install @@ -0,0 +1 @@ +source src/liblwevent/build.install-lib diff --git a/src/libgslevent/build.install-lib b/src/libgslevent/build.install-lib new file mode 100644 index 0000000..c033046 --- /dev/null +++ b/src/libgslevent/build.install-lib @@ -0,0 +1,37 @@ +build_target liblwevent + +# make paths (this is for Gentoo in particular) +build_dir_tree "${LIBDIR}" || return 1 +build_dir_tree "${BINDIR}" || return 1 +build_dir_tree "${INCLUDEDIR}" || return 1 + +# install library +echo "Installing libraries into '${LIBDIR}'" +install_file ${liblwevent} ${LIBDIR} 0755 || return 1 +BASE="${liblwevent_BASE}.so" +MAJOR="${BASE}.${SOMAJOR}" +MICRO="${MAJOR}.${SOMICRO}" +install_symlink "${BASE}" "${MICRO}" "${LIBDIR}" + +# install header +echo "Installing header file '${liblwevent_HEADER}' into ${INCLUDEDIR}" +install_header ${liblwevent_HEADER} ${INCLUDEDIR} 0644 || return 1 + +# install config script +echo "Installing config script into ${BINDIR}" +CONFFILE="${INSTALL_PREFIX}${BINDIR}/liblwevent-config" + +do_cmd rm -f "${CONFFILE}" +do_cmd_redir "${CONFFILE}" sed \ + -e "s,@VERSION@,${VERSION}," \ + -e "s,@DEP_CFLAGS@,${liblwevent_DEP_CFLAGS}," \ + -e "s,@DEP_LIBS@,${liblwevent_DEP_LIBS}," \ + -e "s,@LIB_DIR@,${LIBDIR}," \ + -e "s,@INCLUDE_DIR@,${INCLUDEDIR}," \ + src/liblwevent/config-script + +do_cmd chmod 0755 "${CONFFILE}" +print_success "Done" + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: syntax=sh:expandtab:ts=4:sw=4 diff --git a/src/libgslevent/build.lib b/src/libgslevent/build.lib new file mode 100644 index 0000000..ab55743 --- /dev/null +++ b/src/libgslevent/build.lib @@ -0,0 +1,55 @@ +# These are external variables, and shouldn't clash with anything else +# liblwevent +# liblwevent_BUILT +# liblwevent_HEADER +# liblwevent_BASE +# liblwevent_DEP_CFLAGS +# liblwevent_DEP_LIBS + +if [ -z ${liblwevent_BUILT} ] +then + liblwevent_BASE=liblwevent + source src/liblwevent/soversion + + liblwevent="obj/${liblwevent_BASE}.so.${SOMAJOR}.${SOMICRO}" + liblwevent_DEP_CFLAGS="" # @TODO@ cflags + liblwevent_DEP_LIBS="" # @TODO@ libs + SO_EXTRA="${liblwevent_DEP_CFLAGS} ${liblwevent_DEP_LIBS} -lc" + + echo "Building library ${liblwevent}..." + + do_cmd source src/liblwevent/build.monolithic || return 1 + + MODIFIED=0 + for test in ${MONOLITHIC_TESTS} ${HDR} ${SRC} + do + if [ ${test} -nt ${liblwevent} ] + then + MODIFIED=1 + break + fi + done + + if [ ${MODIFIED} -ne 0 ] + then + echo " Compiling" + + SONAME="${liblwevent_BASE}.so.${SOMAJOR}" + do_cmd ${CC} ${CFLAGS} -Iobj -shared -fpic -o "${liblwevent}" \ + -Wl,-soname,${SONAME} \ + ${SRC} ${SO_EXTRA} || return 1 + + # make tests work + do_cmd ln -sf $(basename ${liblwevent}) obj/${SONAME} || return 1 + + print_success "Library built" + else + print_success "Library up to date" + fi + + liblwevent_BUILT=1 + liblwevent_HEADER=${HDR} + +fi +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: syntax=sh:expandtab:ts=4:sw=4 diff --git a/src/libgslevent/build.monolithic b/src/libgslevent/build.monolithic new file mode 100644 index 0000000..f4fe044 --- /dev/null +++ b/src/libgslevent/build.monolithic @@ -0,0 +1,21 @@ +# These are external variables, and shouldn't clash with anything else +# liblwevent_MONOLITHIC + +SRC="obj/liblwevent.c" +HDR="obj/lwevent.h" + +MONOLITHIC_TESTS="src/liblwevent/build.lib src/liblwevent/build.monolithic" + +if [ -z "${liblwevent_MONOLITHIC}" ] +then + MONOLITHIC_SOURCE="$(find src/liblwevent/ -name '*.h' | sort)" + make_monolithic ${HDR} Ch || return 1 + + MONOLITHIC_SOURCE="$(find src/liblwevent/ -name '*.c' | sort)" + make_monolithic ${SRC} C || return 1 + + liblwevent_MONOLITHIC=1 + MONOLITHIC_DOC="${MONOLITHIC_DOC} ${HDR}" +fi +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: syntax=sh:expandtab:ts=4:sw=4 diff --git a/src/libgslevent/config-script b/src/libgslevent/config-script new file mode 100644 index 0000000..77a1faa --- /dev/null +++ b/src/libgslevent/config-script @@ -0,0 +1,98 @@ +#!/bin/bash +# liblwevent/src/liblwevent/config-script +# +# liblwevent-config template. Variables are finalised at install time. +# +dep_cflags="@DEP_CFLAGS@" +dep_libs="@DEP_LIBS@" +include_dir="@INCLUDE_DIR@" +include_dir_set="no" +lib_dir="@LIB_DIR@" +lib_dir_set="no" + + + +usage() { + cat <&2 + + + +while [ $# -gt 0 ] +do + case "$1" in + -*=*) + optarg="$(echo "$1" | sed 's/[-_a-zA-Z0-9]*=//')" + ;; + + *) + optarg="" + ;; + esac + + case "$1" in + --libdir=*) + lib_dir="${optarg}" + lib_dir_set="yes" + ;; + + --libdir) + echo_lib_dir="yes" + ;; + + --includedir=*) + include_dir="${optarg}" + include_dir_set="yes" + ;; + + --includedir) + echo_include_dir="yes" + ;; + + --version) + echo "@VERSION@" + exit 0 + ;; + + --cflags) + [ "${include_dir}" != "/usr/include" ] && includes="-I${include_dir}" + echo_cflags="yes" + ;; + + --libs) + echo_libs="yes" + ;; + + *) + usage 1 1>&2 + ;; + esac + + shift +done + + + +[ "${echo_prefix}" == "yes" ] && echo "${prefix}" +[ "${echo_exec_prefix}" == "yes" ] && echo "${exec_prefix}" +[ "${echo_cflags}" == "yes" ] && echo "${dep_cflags} ${includes}" +[ "${echo_libs}" == "yes" ] && echo "${dep_libs} -L${lib_dir} -llwevent" +true + + + +# vim: syntax=sh:expandtab:ts=4:sw=4 +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; diff --git a/src/libgslevent/soversion b/src/libgslevent/soversion new file mode 100644 index 0000000..32f1a4e --- /dev/null +++ b/src/libgslevent/soversion @@ -0,0 +1,15 @@ +# liblwevent/src/liblwevent/soversion +# +# (c)2007, Laurence Withers, . +# Released under the GNU GPLv2. See file COPYING or +# http://www.gnu.org/copyleft/gpl.html for details. +# + + + +# SOMAJOR is included in the library's soname, and needs to be bumped +# after a binary-incompatible release. It is a single integer. +SOMAJOR=0 + +# SOMICRO is bumped every time there is a binary-compatible release. +SOMICRO=0 diff --git a/version b/version new file mode 100644 index 0000000..f5daef8 --- /dev/null +++ b/version @@ -0,0 +1,17 @@ +# liblwevent/version +# +# (c)2007, Laurence Withers, . +# Released under the GNU GPLv2. See file COPYING or +# http://www.gnu.org/copyleft/gpl.html for details. +# + + + +# VERSION contains the full version number of the library, which is +# expected to be in 'major.minor.micro' format. +VERMAJOR=0 +VERMINOR=0 +VERMICRO=0 + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: expandtab:ts=4:sw=4