hs-bibutils (empty) → 0.1
raw patch · 7 files changed
+938/−0 lines, 7 filesdep +basedep +sybsetup-changed
Dependencies added: base, syb
Files
- LICENSE +27/−0
- README +201/−0
- Setup.lhs +3/−0
- bibutils.patch +214/−0
- cbits/stub.c +11/−0
- hs-bibutils.cabal +48/−0
- src/Text/Bibutils.hsc +434/−0
+ LICENSE view
@@ -0,0 +1,27 @@+Copyright (c) Andrea Rossato++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:+1. Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.+2. Redistributions in binary form must reproduce the above copyright+ notice, this list of conditions and the following disclaimer in the+ documentation and/or other materials provided with the distribution.+3. Neither the name of the author nor the names of his contributors+ may be used to endorse or promote products derived from this software+ without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF+SUCH DAMAGE.
+ README view
@@ -0,0 +1,201 @@+% Haskell Bindings to Bibutils, the Bibliography Conversion Utilities+% Andrea Rossato++About+-----++[hs-bibutils] is library with Haskell bindings to Chris Putnam's+[bibutils], a library that interconverts between various bibliography+formats using a common MODS-format XML intermediate.++[hs-bibutils] can be used with [citeproc-hs] and [pandoc] to read and+use various bibliographic database formats for processing and+automatically formatting citations andreferences according to a [CSL]+style.++[citeproc-hs] adds to [pandoc], the famous [Haskell] text processing+tool, a Bibtex like citation and bibliographic formatting and+generation facility.++[CSL] is an XML language for specifying citation and bibliographic+formatting, similar in principle to BibTeX `.bst` files or the binary+style files in commercial products like Endnote or Reference Manager.++Download+--------++[hs-bibutils] can be downloaded from [Hackage]:++<http://hackage.haskell.org/cgi-bin/hackage-scripts/package/hs-bibutils>++To get the darcs source run:++ darcs get http://code.haskell.org/hs-bibutils/++Installation+------------++[hs-bibutils] requires [bibutils] version 4.0 or higher. Moreover, it+requires the [bibutils] library to be installed on your system as a+share object. This is necessary if you want to use the library with+GHCi or [andoc].++At the present time, though, [bibutils] default compilation and+installation scripts only build a static library to be used for+building the various [bibutils]' binaries, the only ones being+installed.++In other words you need to either patch or download a patched version+of [bibutils] in order to build and install the library as a share+object.[^1]++### Obtaining a patched version of bibutils++You can download a patched version of [bibutils] here:++<http://code.haskell.org/hs-bibutils/bibutils-4.1-ar.tar.gz>++To install it run:++ tar xvfz bibutils-4.1-ar.tar.gz+ cd bibutils-4.1-ar+ ./configure+ make++And now install it with, as root:++ make installlib++### Patching bibutils++You can patch [bibutils] by yourself.++Download version 4.1 from here:++<http://www.scripps.edu/~cdputnam/software/bibutils/bibutils_4.1_src.tgz>++and apply the patch that comes with the [hs-bibutils] source code,+`bibutils.patch`.++ tar xvfz bibutils-4.1.tar.gz+ cd bibutils-4.1+ patch -p0 < bibutils.patch++Now you can configure and build:++ ./configure+ make++And now as root:++ make installlib++### Installing hs-bibutils++Now you need install [hs-bibutils]. After unpacking the source code+run:++ runhaskell Setup.lhs configure --extra-include-dirs=/path/to/bibutils_4.1/lib++Change `/path/to/bibutils_4.1/lib` to point to the `lib` sub-directory+of the [bibutils] source code.++`--extra-include-dirs=/path/to/bibutils_4.1/lib` will tell the+compiler where to find the library header files needed to compile the+bindings.++Now you can build and install:++ runhaskell Setup.lhs build+ runhaskell Setup.lhs install++This last step requires `root` privileges.++If you don't have `root` privileges you can install [hs-bibutils]+locally with these commands:++ runhaskell Setup.lhs configure --extra-include-dirs=/path/to/bibutils_4.1/lib --user --prefix=$HOME+ runhaskell Setup.lhs build+ runhaskell Setup.lhs install --user++Documentation+-------------++The [Haddock] generated documentation is available here:++<http://code.haskell.org/hs-bibutils/docs/>++The original API documentation is available here:++<http://www.scripps.edu/~cdputnam/software/bibutils/library_specs.html>++Bug Reports+-----------++To submit bug reports you can use the [citeproc-hs] bug tracking+system available at the following address:++<http://code.google.com/p/citeproc-hs/issues>++Credits+-------++Thanks to [Chris Putnam] for his help.++Author+------++Andrea Rossato++`andrea.rossato at unitn.it`++Links to Related Projects+----------------++Bibutils+: <http://www.scripps.edu/~cdputnam/software/bibutils/>++Pandoc+: <http://johnmacfarlane.net/pandoc/>++Citeproc-hs:+: <http://code.haskell.org/citeproc-hs/>++CSL+: <http://xbiblio.sourceforge.net/csl/>++Legal+-----++This software is released under a BSD-style license. See LICENSE for+more details.++Be aware, however, that bibutils itself is licensed under the GPL. If+you wish to use the hs-bibutils bindings, your project will need to be+GPL compatible.++This is an early, "alpha" release. It carries no warranties of any kind.++Copyright © 2008 Andrea Rossato++[^1]: The library must be a shared object and must be installed in+order to build [pandoc] because [pandoc] uses the Template Haskell+extension to produce some source code at compilation time. This+extension requires running the GHCi interpreter which can only deal+with shared objects. If the library is a static object+(`libbibutils.a`) the compilation of [pandoc] or the use of the+library with GHCi will fail.++[hs-bibutils]: http://code.haskell.org/hs-bibutils+[bibutils]: http://www.scripps.edu/~cdputnam/software/bibutils/+[Hackage]: http://hackage.haskell.org/cgi-bin/hackage-scripts/package/hs-bibutils+[citeproc-hs]: http://code.haskell.org/citeproc-hs+[CSL]: http://xbiblio.sourceforge.net/csl/+[pandoc]: http://johnmacfarlane.net/pandoc/+[Zotero]: http://www.zotero.org+[MODS]: http://www.loc.gov/mods/+[Bruce D'Arcus]: http://community.muohio.edu/blogs/darcusb/+[John MacFarlane]: http://johnmacfarlane.net/+[Chris Putnam]: http://www.scripps.edu/~cdputnam/+[Haskell]: http://www.haskell.org/+[Haddock]: http://www.haskell.org/haddock/
+ Setup.lhs view
@@ -0,0 +1,3 @@+#!/usr/bin/env runhaskell+> import Distribution.Simple+> main = defaultMain
+ bibutils.patch view
@@ -0,0 +1,214 @@+diff -ur ../bibutils_4.1/Makefile_start ./Makefile_start+--- ../bibutils_4.1/Makefile_start 2008-12-21 19:31:06.000000000 +0100++++ ./Makefile_start 2008-12-26 11:26:01.000000000 +0100+@@ -1,7 +1,13 @@+ POSTFIX=REPLACE_POSTFIX+ CC = REPLACE_CC+ RANLIB=REPLACE_RANLIB+-INSTALLDIR=REPLACE_INSTALLDIR++PREFIX=REPLACE_PREFIX++LIBDIR=${PREFIX}/lib++SHCC=REPLACE_SHCC++SHLD=REPLACE_SHLD++INSTALL = /usr/bin/ginstall -c++SHLIB = lib/libbibutils.so++STLIB = lib/libbibutils.a+ + VERSION=4.1+ DATE=12/21/08+@@ -10,7 +16,7 @@+ xml2ads xml2bib xml2end xml2isi xml2ris xml2wordbib modsclean+ + all : FORCE+- cd lib; make -k $(CC) -k $(RANLIB); cd ..++ cd lib; make -k $(SHCC) -k $(SHLD) -k $(RANLIB); cd ..+ cd bin; make -k $(CC) -k VERSION="$(VERSION)" -k DATE="$(DATE)"; cd ..+ + clean: FORCE+@@ -30,9 +36,13 @@+ + install: all FORCE+ sed 's/VERSION/${VERSION}/g' packageconfig_start > lib/bibutils.pc+-# @for p in ${PROGRAMS}; \+-# do ( cp bin/$$p ${INSTALLDIR}/$$p ); \+-# done++ @for p in ${PROGRAMS}; \++ do ( cp bin/$$p ${INSTALLDIR}/$$p ); \++ done++++installlib:++ ${INSTALL} ${SHLIB} ${DESTDIR}${LIBDIR}++ ${INSTALL} ${STLIB} ${DESTDIR}${LIBDIR}+ + package: all FORCE+ csh -f maketgz.csh ${VERSION} ${POSTFIX}+diff -ur ../bibutils_4.1/configure ./configure+--- ../bibutils_4.1/configure 2008-12-20 00:48:40.000000000 +0100++++ ./configure 2008-12-26 11:18:16.000000000 +0100+@@ -3,15 +3,15 @@+ set INPUT_FILE = Makefile_start+ set OUTPUT_FILE = Makefile+ +-set INSTALLDIR = /usr/local/bin++set PREFIX = /usr/local+ + if ( ${#argv} > 0 ) then+- if ( $1 == "--install-dir" ) then++ if ( $1 == "--prefix" ) then+ if ( ${#argv} < 2 ) then+- echo "--install-dir requires a directory"++ echo "--prefix requires a directory"+ exit+ else+- set INSTALLDIR = $2++ set PREFIX = $2+ endif+ else+ echo "Unidentified argument $1"+@@ -76,81 +76,105 @@+ #POSTFIX=REPLACE_POSTFIX+ #CC = REPLACE_CC+ #RANLIB=REPLACE_RANLIB+-#INSTALLDIR=REPLACE_INSTALLDIR++#PREFIX=REPLACE_PREFIX+ + if ( $type == "Linux_x86" ) then+ cat $INPUT_FILE | \+ sed 's/REPLACE_CC/CC="cc -Wall"/' | \++ sed 's/REPLACE_SHCC/CC="cc -Wall -fPIC"/' | \++ sed 's/REPLACE_SHLD/SHLD="gcc -shared -I."/' | \+ sed 's/REPLACE_RANLIB/RANLIB="ranlib"/' | \+- sed "s|REPLACE_INSTALLDIR|${INSTALLDIR}|" | \++ sed "s|REPLACE_PREFIX|${PREFIX}|" | \+ sed 's/REPLACE_POSTFIX/_i386/' > $OUTPUT_FILE+ else if ( $type == "Linux_x86_64" ) then+ cat $INPUT_FILE | \+ sed 's/REPLACE_CC/CC="cc -Wall"/' | \++ sed 's/REPLACE_SHCC/CC="cc -Wall -fPIC"/' | \++ sed 's/REPLACE_SHLD/SHLD="gcc -shared -I."/' | \+ sed 's/REPLACE_RANLIB/RANLIB="ranlib"/' | \+- sed "s|REPLACE_INSTALLDIR|${INSTALLDIR}|" | \++ sed "s|REPLACE_PREFIX|${PREFIX}|" | \+ sed 's/REPLACE_POSTFIX/_i386/' > $OUTPUT_FILE+ else if ( $type == "Linux_Unknown" ) then+ cat $INPUT_FILE | \+ sed 's/REPLACE_CC/CC="cc -Wall"/' | \++ sed 's/REPLACE_SHCC/CC="cc -Wall -fPIC"/' | \++ sed 's/REPLACE_SHLD/SHLD="gcc -shared -I."/' | \+ sed 's/REPLACE_RANLIB/RANLIB="ranlib"/' | \+- sed "s|REPLACE_INSTALLDIR|${INSTALLDIR}|" | \++ sed "s|REPLACE_PREFIX|${PREFIX}|" | \+ sed 's/REPLACE_POSTFIX//' > $OUTPUT_FILE+ else if ( $type == "MacOSX_ppc" && $universal_binary == "TRUE" ) then+ cat $INPUT_FILE | \+ sed 's/REPLACE_CC/CC="cc -arch i386 -arch ppc -Wall"/' | \++ sed 's/REPLACE_SHCC/CC="cc -arch i386 -arch ppc -Wall"/' | \++ sed 's/REPLACE_SHLD/SHLD="cc -bundle -flat_namespace -undefined suppress"/' | \+ sed 's/REPLACE_RANLIB/RANLIB="ranlib -s"/' | \+- sed "s|REPLACE_INSTALLDIR|${INSTALLDIR}|" | \++ sed "s|REPLACE_PREFIX|${PREFIX}|" | \+ sed 's/REPLACE_POSTFIX/_osx_universal/' > $OUTPUT_FILE+ else if ( $type == "MacOSX_intel" && $universal_binary == "TRUE" ) then+ cat $INPUT_FILE | \+ sed 's/REPLACE_CC/CC="cc -arch i386 -arch ppc -Wall"/' | \++ sed 's/REPLACE_SHCC/CC="cc -arch i386 -arch ppc -Wall"/' | \++ sed 's/REPLACE_SHLD/SHLD="cc -bundle -flat_namespace -undefined suppress"/' | \+ sed 's/REPLACE_RANLIB/RANLIB="ranlib -s"/' | \+- sed "s|REPLACE_INSTALLDIR|${INSTALLDIR}|" | \++ sed "s|REPLACE_PREFIX|${PREFIX}|" | \+ sed 's/REPLACE_POSTFIX/_osx_universal/' > $OUTPUT_FILE+ else if ( $type == "MacOSX_ppc" || $type == "MacOSX_intel" || \+ $type == "MacOSX_unknown" ) then+ cat $INPUT_FILE | \+ sed 's/REPLACE_CC/CC="cc -Wall"/' | \++ sed 's/REPLACE_SHCC/CC="cc -arch i386 -arch ppc -Wall"/' | \++ sed 's/REPLACE_SHLD/SHLD="cc -bundle -flat_namespace -undefined suppress"/' | \+ sed 's/REPLACE_RANLIB/RANLIB="ranlib -s"/' | \+- sed "s|REPLACE_INSTALLDIR|${INSTALLDIR}|" | \++ sed "s|REPLACE_PREFIX|${PREFIX}|" | \+ sed 's/REPLACE_POSTFIX/_osx/' > $OUTPUT_FILE+ else if ( $type == "SunOS5" ) then+ cat $INPUT_FILE | \+ sed 's|REPLACE_CC|CC="gcc"|' | \++ sed 's/REPLACE_SHCC/CC="gcc -Wall -fPIC"/' | \++ sed 's/REPLACE_SHLD/SHLD="gcc -shared -I."/' | \+ sed 's/REPLACE_RANLIB/RANLIB="echo Skipping ranlib"/' | \+- sed "s|REPLACE_INSTALLDIR|${INSTALLDIR}|" | \++ sed "s|REPLACE_PREFIX|${PREFIX}|" | \+ sed 's/REPLACE_POSTFIX/_sunos5/' > $OUTPUT_FILE+ else if ( $type == "IRIX" ) then+ cat $INPUT_FILE | \+ sed 's|REPLACE_CC|CC="/tsri/gnu/sgi4DIRIX6/bin/gcc"|' | \++ sed 's/REPLACE_SHCC/CC="/tsri/gnu/sgi4DIRIX6/bin/gcc -Wall -fPIC"/' | \++ sed 's/REPLACE_SHLD/SHLD="/tsri/gnu/sgi4DIRIX6/bin/gcc -shared -I."/' | \+ sed 's/REPLACE_RANLIB/RANLIB="echo Skipping ranlib"/' | \+- sed "s|REPLACE_INSTALLDIR|${INSTALLDIR}|" | \++ sed "s|REPLACE_PREFIX|${PREFIX}|" | \+ sed 's/REPLACE_POSTFIX/_irix/' > $OUTPUT_FILE+ else if ( $type == "NetBSD" ) then+ cat $INPUT_FILE | \+ sed 's/REPLACE_CC/CC="cc -Wall"/' | \++ sed 's/REPLACE_SHCC/CC="cc -Wall -fPIC"/' | \++ sed 's/REPLACE_SHLD/SHLD="gcc -shared -I."/' | \+ sed 's/REPLACE_RANLIB/RANLIB="ranlib"/' | \+- sed "s|REPLACE_INSTALLDIR|${INSTALLDIR}|" | \++ sed "s|REPLACE_PREFIX|${PREFIX}|" | \+ sed 's/REPLACE_POSTFIX/_netbsd/' > $OUTPUT_FILE+ else if ( $type == "FreeBSD" ) then+ cat $INPUT_FILE | \+ sed 's/REPLACE_CC/CC="cc -Wall"/' | \++ sed 's/REPLACE_SHCC/CC="cc -Wall -fPIC"/' | \++ sed 's/REPLACE_SHLD/SHLD="gcc -shared -I."/' | \+ sed 's/REPLACE_RANLIB/RANLIB="ranlib"/' | \+- sed "s|REPLACE_INSTALLDIR|${INSTALLDIR}|" | \++ sed "s|REPLACE_PREFIX|${PREFIX}|" | \+ sed 's/REPLACE_POSTFIX/_freebsd/' > $OUTPUT_FILE+ else if ( $type == "Cygwin" ) then+ cat $INPUT_FILE | \+ sed 's/REPLACE_CC/"CC=cc"/' | \++ sed 's/REPLACE_SHCC/CC="cc -fPIC"/' | \++ sed 's/REPLACE_SHLD/SHLD="gcc -shared -I."/' | \+ sed 's/REPLACE_RANLIB/RANLIB="echo Skipping ranlib"/' | \+- sed "s|REPLACE_INSTALLDIR|${INSTALLDIR}|" | \++ sed "s|REPLACE_PREFIX|${PREFIX}|" | \+ sed 's/REPLACE_POSTFIX/_cygwin/' > $OUTPUT_FILE+ else+ # Unknown operating system+ cat $INPUT_FILE | \+ sed 's/REPLACE_CC/"CC=cc"/' | \++ sed 's/REPLACE_SHCC/CC="cc -fPIC"/' | \++ sed 's/REPLACE_SHLD/SHLD="gcc -shared -I."/' | \+ sed 's/REPLACE_RANLIB/RANLIB="echo Skipping ranlib"/' | \+- sed "s|REPLACE_INSTALLDIR|${INSTALLDIR}|" | \++ sed "s|REPLACE_PREFIX|${PREFIX}|" | \+ sed 's/REPLACE_POSTFIX//' > $OUTPUT_FILE+ endif+ +@@ -164,13 +188,14 @@+ echo " e-mail cdputnam@ucsd.edu with the system type and output of"+ echo " the command: uname -a"+ echo+-echo "Set installation directory to $INSTALLDIR."+-echo " To modify install directory type: configure --install-dir DIR"++echo "Set installation directory to $PREFIX."++echo " To modify install directory type: configure --prefix DIR"+ echo " where DIR is the desired directory."+ echo+ if ( $OUTPUT_FILE == "Makefile" ) then+ echo "To compile, type: make"+ echo "To install, type: make install"++ echo "To install the library, type: make installlib"+ echo "To make tgz package, type: make package"+ echo "To make deb package, type: make deb"+ echo+diff -ur ../bibutils_4.1/lib/Makefile ./lib/Makefile+--- ../bibutils_4.1/lib/Makefile 2008-12-21 00:17:31.000000000 +0100++++ ./lib/Makefile 2008-12-26 11:19:48.000000000 +0100+@@ -24,6 +24,7 @@+ all: libbibutils.a+ + libbibutils.a: $(BIBUTILS_OBJS)++ ${SHLD} -o libbibutils.so $(BIBUTILS_OBJS)+ ar -cr libbibutils.a $(BIBUTILS_OBJS)+ $(RANLIB) libbibutils.a+
+ cbits/stub.c view
@@ -0,0 +1,11 @@+#include <stdio.h>++FILE *c_stdout()+{+ return stdout;+}++FILE *c_stdin()+{+ return stdin;+}
+ hs-bibutils.cabal view
@@ -0,0 +1,48 @@+name: hs-bibutils+version: 0.1+homepage: http://code.haskell.org/hs-bibutils++synopsis: Haskell bindings to bibutils, the bibliography+ conversion utilities.++description: Haskell bindings to Chris Putnam's bibutils, a+ library that interconverts between various+ bibliography formats using a common MODS-format+ XML intermediate.+ .+ hs-bibutils is available under a BSD3 license. See+ the LICENSE file for details.+ .+ Be aware, however, that bibutils itself is+ licensed under the GPL. If you wish to use the+ hs-bibutils bindings, your project will need to be+ GPL compatible.+ .+ For more details about bibutils, please check:+ <http://www.scripps.edu/~cdputnam/software/bibutils/>.+ .+ The original API documentation is available here:+ <http://www.scripps.edu/~cdputnam/software/bibutils/library_specs.html>.++category: Text+license: BSD3+license-file: LICENSE+author: Andrea Rossato+maintainer: andrea.rossato@unitn.it+cabal-version: >= 1.4+build-type: Simple++library+ exposed-modules: Text.Bibutils+ other-modules:+ ghc-options: -funbox-strict-fields -Wall+ ghc-prof-options: -prof -auto-all+ hs-source-dirs: src+ extra-libraries: bibutils+ extensions: ForeignFunctionInterface+ c-sources: cbits/stub.c++ if impl(ghc >= 6.10)+ build-depends: base >= 4, syb+ else+ build-depends: base >= 3 && < 4
+ src/Text/Bibutils.hsc view
@@ -0,0 +1,434 @@+{-# CFILES cbits/stub.c #-}+-----------------------------------------------------------------------------+-- |+-- Module : Text..Bibutils+-- Copyright : (C) 2008 Andrea Rossato+-- License : BSD3+--+-- Maintainer : andrea.rossato@unitn.it+-- Stability : provisional+-- Portability : portable+--+-- Here is a simple program using hs-bibutils to conver a MODS+-- collection into a bibtex file, sending the output to stdout:+--+-- > import Text.Bibutils+-- >+-- > main :: IO ()+-- > main = do+-- > bibl <- bibl_init+-- > param <- bibl_initparams mods_in bibtex_out "mods2bibtex"+-- > setFormatOpts param [bibout_brackets, bibout_uppercase]+-- > setBOM param+-- > setVerbose param+-- > bibl_read param bibl "/path/to/bibtex.bib"+-- > bibl_write param bibl "-"+-- > bibl_free bibl+-- > bibl_freeparams param+--+-----------------------------------------------------------------------------++module Text.Bibutils+ ( -- * Basic Functions+ Bibl+ , Param (..)+ , bibl_init+ , bibl_initparams+ , bibl_read+ , bibl_write+ , bibl_free+ , bibl_freeparams+ , bibl_reporterr++ -- * Auxiliary Functions+ , numberOfRefs+ , status+ -- ** Functions for Setting Parameters+ , setParam+ , setFormatOpts+ , setCharsetIn+ , setCharsetOut+ , setBOM+ , unsetBOM+ , setLatexOut+ , unsetLatexOut+ , setXmlOut+ , unsetXmlOut+ , setAddcount+ , unsetAddcount+ , setSinglerefperfile+ , unsetSinglerefperfile+ , setVerbose+ , unsetVerbose++ -- * Input Formats+ , BiblioIn+ , mods_in+ , bibtex_in+ , ris_in+ , endnote_in+ , copac_in+ , isi_in+ , medline_in+ , biblatex_in+ , endnotexml_in++ -- * Output Formats+ , BiblioOut+ , mods_out+ , bibtex_out+ , ris_out+ , endnote_out+ , isi_out+ , word2007_out+ , adsab_out++ -- * Options for Specific Output Formats+ , FormatOpt+ , bibout_finalcomma+ , bibout_singledash+ , bibout_whitespace+ , bibout_brackets+ , bibout_uppercase+ , bibout_strictkey+ , modsout_dropkey+ , wordout_dropkey++ -- * Charsets+ , Charset+ , bibl_charset_unknown+ , bibl_charset_unicode+ , bibl_charset_gb18030+ , bibl_charset_default++ -- * Return Status+ , Status+ , bibl_ok+ , bibl_err_badinput+ , bibl_err_memerr+ , bibl_err_cantopen++ ) where++import Control.Monad+import Foreign.C+import Foreign+import System.IO++-- | A type for storing the C struct with the bibliography data.+-- Mostly opaque to the Haskell side. See 'numberOfRefs' to retrieve+-- the number of references stored in the struct.+newtype Bibl = Bibl { nrefs :: CLong }++instance Storable Bibl where+ sizeOf _ = #{size bibl}+ alignment _ = #{alignment bibl}+ peek p = #{peek bibl, nrefs } p >>= return . Bibl+ poke p (Bibl n) = #{poke bibl, nrefs } p n++-- | Initialize the 'Bibl' C struct. Usually the first function being+-- called.+bibl_init :: IO (ForeignPtr Bibl)+bibl_init+ = alloca $ \p -> do+ c_bibl_init p+ newForeignPtr_ p++-- | Free the 'Bibl' C struct.+bibl_free :: ForeignPtr Bibl -> IO ()+bibl_free bibl = withForeignPtr bibl c_bibl_free++-- | Retrieve the number of references from a 'Bibl' C struct.+numberOfRefs :: ForeignPtr Bibl -> IO Int+numberOfRefs b+ = withForeignPtr b $ \cb -> peek cb >>= return . fromIntegral . nrefs++-- | A type for storing the Param C struct. It should be accessed with+-- the functions provided, such as 'setCharsetIn', etc.+data Param+ = Param+ { redaformat :: CInt+ , writeformat :: CInt+ , charsetin :: CInt+ , charsetin_src :: CUChar+ , latexin :: CUChar+ , utf8in :: CUChar+ , xmlin :: CUChar+ , charsetout :: CInt+ , charsetout_src :: CUChar+ , latexout :: CUChar+ , utf8out :: CUChar+ , utf8bom :: CUChar+ , xmlout :: CUChar+ , format_opts :: CInt+ , addcount :: CInt+ , output_raw :: CUChar+ , verbose :: CUChar+ , singlerefperfile :: CUChar+ } deriving ( Show )++instance Storable Param where+ sizeOf _ = #{size param}+ alignment _ = #{alignment param}+ peek p = Param+ `fmap` #{peek param, readformat } p+ `ap` #{peek param, writeformat } p+ `ap` #{peek param, charsetin } p+ `ap` #{peek param, charsetin_src } p+ `ap` #{peek param, latexin } p+ `ap` #{peek param, utf8in } p+ `ap` #{peek param, xmlin } p+ `ap` #{peek param, charsetout } p+ `ap` #{peek param, charsetout_src } p+ `ap` #{peek param, latexout } p+ `ap` #{peek param, utf8out } p+ `ap` #{peek param, utf8bom } p+ `ap` #{peek param, xmlout } p+ `ap` #{peek param, format_opts } p+ `ap` #{peek param, addcount } p+ `ap` #{peek param, output_raw } p+ `ap` #{peek param, verbose } p+ `ap` #{peek param, singlerefperfile } p+ poke p (Param rf wf ci csi li ui xi co cso lo uo ub xo fo a raw v s) = do+ #{poke param, readformat } p rf+ #{poke param, writeformat } p wf+ #{poke param, charsetin } p ci+ #{poke param, charsetin_src } p csi+ #{poke param, latexin } p li+ #{poke param, utf8in } p ui+ #{poke param, xmlin } p xi+ #{poke param, charsetout } p co+ #{poke param, charsetout_src } p cso+ #{poke param, latexout } p lo+ #{poke param, utf8out } p uo+ #{poke param, utf8bom } p ub+ #{poke param, xmlout } p xo+ #{poke param, format_opts } p fo+ #{poke param, addcount } p a+ #{poke param, output_raw } p raw+ #{poke param, verbose } p v+ #{poke param, singlerefperfile } p s++-- | Initialize the 'Param' C struct, given the input bibliographic+-- format, the output bibliographic format, and the program name to+-- be used for displaying debugging information.+bibl_initparams :: BiblioIn -> BiblioOut -> String -> IO (ForeignPtr Param)+bibl_initparams i o s+ = alloca $ \p -> withCString s $ \cs -> do+ c_bibl_initparams p (unBiblioIn i) (unBiblioOut o) cs+ newForeignPtr_ p++-- | Free the 'Param' C struct.+bibl_freeparams :: ForeignPtr Param -> IO ()+bibl_freeparams param = withForeignPtr param c_bibl_freeparams++-- | Set fields of the 'Param' C struct directly.+setParam :: ForeignPtr Param -> (Param -> Param) -> IO ()+setParam p f = withForeignPtr p $ \cp -> peek cp >>= poke cp . f++-- | Set the input charset. Default is Latin-1 (ISO8859-1). See+-- 'Charset'.+setCharsetIn :: ForeignPtr Param -> Charset -> IO ()+setCharsetIn p c+ = setParam p $ \param -> param { charsetin = charset c }++-- | Set the output charset.+setCharsetOut :: ForeignPtr Param -> Charset -> IO ()+setCharsetOut p c+ = setParam p $ \param -> param { charsetout = charset c }++-- | Set output format specific options. See 'FormatOpt'.+setFormatOpts :: ForeignPtr Param -> [FormatOpt] -> IO ()+setFormatOpts p os+ = setParam p $ \param -> param { format_opts = unFormatOpt $ combineFormatOpts os }++-- | Write utf8 byte-order-mark.+setBOM :: ForeignPtr Param -> IO ()+setBOM p+ = setParam p $ \param -> param { utf8bom = 1 }++unsetBOM :: ForeignPtr Param -> IO ()+unsetBOM p+ = setParam p $ \param -> param { utf8bom = 0 }++-- | Write Latex codes.+setLatexOut :: ForeignPtr Param -> IO ()+setLatexOut p+ = setParam p $ \param -> param { latexout = 1 }++unsetLatexOut :: ForeignPtr Param -> IO ()+unsetLatexOut p+ = setParam p $ \param -> param { latexout = 0 }++-- | Write characters in XML entities.+setXmlOut :: ForeignPtr Param -> IO ()+setXmlOut p+ = setParam p $ \param -> param { xmlout = 1 }++unsetXmlOut :: ForeignPtr Param -> IO ()+unsetXmlOut p+ = setParam p $ \param -> param { xmlout = 0 }++-- | Add reference count to reference id.+setAddcount :: ForeignPtr Param -> IO ()+setAddcount p+ = setParam p $ \param -> param { addcount = 1 }++unsetAddcount :: ForeignPtr Param -> IO ()+unsetAddcount p+ = setParam p $ \param -> param { addcount = 0 }++-- | Output a single reference for each file.+setSinglerefperfile :: ForeignPtr Param -> IO ()+setSinglerefperfile p+ = setParam p $ \param -> param { singlerefperfile = 1 }++unsetSinglerefperfile :: ForeignPtr Param -> IO ()+unsetSinglerefperfile p+ = setParam p $ \param -> param { singlerefperfile = 0 }++-- | Verbose output.+setVerbose :: ForeignPtr Param -> IO ()+setVerbose p+ = setParam p $ \param -> param { verbose = 1 }++-- | Suppress verbose output.+unsetVerbose :: ForeignPtr Param -> IO ()+unsetVerbose p+ = setParam p $ \param -> param { verbose = 0 }++-- | Given a 'Param' C structure, a 'Bibl' C structure, the path to+-- the input file (@\"-\"@ for the standard input), read the file,+-- storing the data in the 'Bibl' struct, and report a 'Status'.+bibl_read :: ForeignPtr Param -> ForeignPtr Bibl -> FilePath -> IO Status+bibl_read param bibl path+ = withForeignPtr param $ \cparam ->+ withForeignPtr bibl $ \cbibl ->+ withCString path $ \cpath ->+ withCString "r" $ \cmode -> do+ cfile <- if path == "-"+ then return c_stdin+ else throwErrnoIfNull "fopen: " (fopen cpath cmode)+ cint <- c_bibl_read cbibl cfile cpath cparam+ when (path /= "-") $ fclose cfile >> return ()+ return $ Status cint++-- | Given a 'Param' C structure, a 'Bibl' C structure, the path to an+-- output file (@\"-\"@ for the standard output), write the file+-- returning a 'Status'.+bibl_write :: ForeignPtr Param -> ForeignPtr Bibl -> FilePath -> IO Status+bibl_write param bibl path+ = withForeignPtr param $ \cparam ->+ withForeignPtr bibl $ \cbibl ->+ withCString "w" $ \cmode -> do+ cfile <- if path == "-"+ then return c_stdout+ else withCString path $ throwErrnoIfNull "fopen: " . flip fopen cmode+ cint <- c_bibl_write cbibl cfile cparam+ when (path /= "-") $ fclose cfile >> return ()+ return $ Status cint++bibl_reporterr :: Status -> IO ()+bibl_reporterr (Status n) = c_bibl_reporterr n++newtype BiblioIn = BiblioIn { unBiblioIn :: CInt }+ deriving ( Eq )++#{enum BiblioIn, BiblioIn+ , mods_in = BIBL_MODSIN+ , bibtex_in = BIBL_BIBTEXIN+ , ris_in = BIBL_RISIN+ , endnote_in = BIBL_ENDNOTEIN+ , copac_in = BIBL_COPACIN+ , isi_in = BIBL_ISIIN+ , medline_in = BIBL_MEDLINEIN+ , endnotexml_in = BIBL_ENDNOTEXMLIN+ , biblatex_in = BIBL_BIBLATEXIN+ }++newtype BiblioOut = BiblioOut { unBiblioOut :: CInt }+ deriving ( Eq )++#{enum BiblioOut, BiblioOut+ , mods_out = BIBL_MODSOUT+ , bibtex_out = BIBL_BIBTEXOUT+ , ris_out = BIBL_RISOUT+ , endnote_out = BIBL_ENDNOTEOUT+ , isi_out = BIBL_ISIOUT+ , word2007_out = BIBL_WORD2007OUT+ , adsab_out = BIBL_ADSABSOUT+ }++newtype FormatOpt = FormatOpt { unFormatOpt :: CInt }++#include "bibtexout.h"+#include "modsout.h"+#include "wordout.h"++#{enum FormatOpt, FormatOpt+ , bibout_finalcomma = BIBOUT_FINALCOMMA+ , bibout_singledash = BIBOUT_SINGLEDASH+ , bibout_whitespace = BIBOUT_WHITESPACE+ , bibout_brackets = BIBOUT_BRACKETS+ , bibout_uppercase = BIBOUT_UPPERCASE+ , bibout_strictkey = BIBOUT_STRICTKEY+ , modsout_dropkey = MODSOUT_DROPKEY+ , wordout_dropkey = WORDOUT_DROPKEY+ }++newtype Status = Status { status :: CInt }+ deriving ( Eq, Show )++#{enum Status, Status+ , bibl_ok = BIBL_OK+ , bibl_err_badinput = BIBL_ERR_BADINPUT+ , bibl_err_memerr = BIBL_ERR_MEMERR+ , bibl_err_cantopen = BIBL_ERR_CANTOPEN+ }++newtype Charset = Charset { charset :: CInt } deriving ( Eq )++#{enum Charset, Charset+, bibl_charset_unknown = BIBL_CHARSET_UNKNOWN+, bibl_charset_unicode = BIBL_CHARSET_UNICODE+, bibl_charset_gb18030 = BIBL_CHARSET_GB18030+, bibl_charset_default = BIBL_CHARSET_DEFAULT+ }++-- Combine a list of options into a single option, using bitwise (.|.)+combineFormatOpts :: [FormatOpt] -> FormatOpt+combineFormatOpts = FormatOpt . foldr ((.|.) . unFormatOpt) 0++#include "bibutils.h"+#include "bibl.h"+#let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__)++foreign import ccall unsafe "bibl_init"+ c_bibl_init :: Ptr Bibl -> IO ()++foreign import ccall unsafe "bibl_free"+ c_bibl_free :: Ptr Bibl -> IO ()++foreign import ccall unsafe "bibl_initparams"+ c_bibl_initparams :: Ptr Param -> CInt -> CInt -> CString -> IO ()++foreign import ccall unsafe "bibl_freeparams"+ c_bibl_freeparams :: Ptr Param -> IO ()++foreign import ccall unsafe "bibl_read"+ c_bibl_read :: Ptr Bibl -> Ptr CFile -> CString -> Ptr Param -> IO CInt++foreign import ccall unsafe "bibl_write"+ c_bibl_write :: Ptr Bibl -> Ptr CFile -> Ptr Param -> IO CInt++foreign import ccall unsafe "bibl_reporterr"+ c_bibl_reporterr :: CInt -> IO ()++foreign import ccall unsafe "fopen"+ fopen :: CString -> CString -> IO (Ptr CFile)++foreign import ccall unsafe "fclose"+ fclose :: Ptr CFile -> IO CInt++foreign import ccall unsafe "c_stdin" c_stdin :: Ptr CFile+foreign import ccall unsafe "c_stdout" c_stdout :: Ptr CFile