\documentclass[11pt]{article} \usepackage{times} \usepackage{pl} \usepackage{html} \sloppy \makeindex \onefile \htmloutput{\Sdot} % Output directory \htmlmainfile{archive} % Main document file \bodycolor{white} % Page colour \begin{document} \title{SWI-Prolog binding to libarchive} \author{Jan Wielemaker \\ VU University Amsterdam \\ The Netherlands \\ E-mail: \email{J.Wielemaker@vu.nl}} \maketitle \begin{abstract} The library \href{https://github.com/libarchive/libarchive}{libarchive} provides a portable way to access archive files as well as encoded (typically compressed) data. This package is a Prolog wrapper around this library. The motivation to introduce this library is twofold. In the first place, it provides a minimal platform independent API to access archives. In the second place, it allows accessing archives through Prolog streams, which often eliminates the need for temporary files and all related consequences for performance, security and platform dependency. \end{abstract} \pagebreak \tableofcontents \vfill \vfill \newpage \section{Motivation} \label{sec:archive-motivation} Archives play two roles: they combine multiple documents into a single one and they typically provide compression and sometimes encryption or other services. Bundling multiple resources into a single archive may greatly simplify distribution and guarantee that the individual resources are consistent. SWI-Prolog provides archiving using its (rather arcane) saved-state format. See \index{resource/3}\predref{resource}{3} and \index{open_resource/3}\predref{open_resource}{3}. It also provides compression by means of library(zlib). External archives may be accessed through the process interface provided by \index{process_create/3}\predref{process_create}{3}, but this has disadvantages. The one that motivated this library was that using external processes provide no decent platform independent access to archives. Most likely zip files come closest to platform independent access, but there are many different programs for accessing zip files that provide slightly different sets of options and the existence of any of these programs cannot be guaranteed without distributing our own bundled version. Similar arguments hold for Unix tar archives, where just about any Unix-derives system has a tar program but except for very basic commands, the command line options are not compatible and tar is not part of Windows. The only format granted on Windows is .cab, but a program to create them is not part of Windows and the .cab format is rare outside the Windows context. Discarding availability of archive programs, each archive program comes with its own set of command line options and its own features and limitations. Fortunately, \href{https://github.com/libarchive/libarchive}{libarchive} provides a consistent interface to a wealth of compression and archiving formats. The library \pllib{archive} wraps this library, providing access to archives using Prolog streams both for the archive as a whole and the archive entries. E.g., archives may be read from Prolog streams and each member in turn may be processed using Prolog streams without materialising data using temporary files. \input{archive4pl.tex} \section{Status} \label{sec:archive-status} The current version is merely a proof-of-concept. It lacks writing archives and does not support many of the options of the underlying library. The main motivation for starting this library was to achieve portability of the upcomming SWI-Prolog package distribution system. Other functionality will be added on `as needed' basis. \printindex \end{document}