slcurl-pre0.2.2-14/ 0002755 0001750 0000062 00000000000 15012561732 012572 5 ustar john staff slcurl-pre0.2.2-14/src/ 0002755 0001750 0000062 00000000000 15012561732 013361 5 ustar john staff slcurl-pre0.2.2-14/src/config.hin 0000644 0001750 0000062 00000000424 11340307670 015323 0 ustar john staff /* -*- c -*- */ /* Define this if have stdlib.h */ #undef HAVE_STDLIB_H /* Define this if you have unistd.h */ #undef HAVE_UNISTD_H /* Set these to the appropriate values */ #undef SIZEOF_SHORT #undef SIZEOF_INT #undef SIZEOF_LONG #undef SIZEOF_FLOAT #undef SIZEOF_DOUBLE slcurl-pre0.2.2-14/src/babelfish.sl 0000644 0001750 0000062 00000014317 11532416162 015643 0 ustar john staff % Copyright (C) 2005-2010 John E. Davis % This file is part of the S-Lang Curl Module % This script is free software; you can redistribute it and/or % modify it under the terms of the GNU General Public License as % published by the Free Software Foundation; either version 2 of the % License, or (at your option) any later version. % The script is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU % General Public License for more details. % You should have received a copy of the GNU General Public License % along with this library; if not, write to the Free Software % Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, % USA. require ("curl"); $1 = path_concat (path_concat (path_dirname (__FILE__), "help"), "babelfish.hlp"); if (NULL != stat_file ($1)) add_doc_file ($1); private variable Supported_Translations = ["zh_en", "zh_zt", "zt_en", "zt_zh", "en_zh", "en_zt", "en_nl", "en_fr", "en_de", "en_el", "en_it", "en_ja", "en_ko", "en_pt", "en_ru", "en_es", "nl_en", "nl_fr", "fr_nl", "fr_en", "fr_de", "fr_el", "fr_it", "fr_pt", "fr_es", "de_en", "de_fr", "el_en", "el_fr", "it_en", "it_fr", "ja_en", "ko_en", "pt_en", "pt_fr", "ru_en", "es_en", "es_fr"]; private variable Languages = Assoc_Type[String_Type]; private define add_language (lang, desc) { Languages[strlow(lang)] = strlow (desc); } add_language ("zh", "Chinese-simple"); add_language ("zt", "Chinese-traditional"); add_language ("en", "English"); add_language ("nl", "Dutch"); add_language ("fr", "French"); add_language ("de", "German"); add_language ("el", "Greek"); add_language ("it", "Italian"); add_language ("ja", "Japanese"); add_language ("ko", "Korean"); add_language ("pt", "Portugese"); add_language ("ru", "Russian"); add_language ("es", "Spanish"); private define lookup_language (lang) { lang = strlow (lang); if (assoc_key_exists (Languages, lang)) return lang; variable vals = assoc_get_values (Languages); variable i = where (vals == lang); if (length (i) == 0) throw NotImplementedError, "Language $lang is unknown or unsupported"$; return assoc_get_keys (Languages)[i[0]]; } private define lookup_translation (from, to) { from = lookup_language (from); to = lookup_language (to); variable trans = sprintf ("%s_%s", from, to); if (any (Supported_Translations == trans)) return trans; throw NotImplementedError, "Translating from $from to $to is not supported"$; } private define parse_output (str) { %() = fputs (str, stdout); (str,) = strreplace (str, "\n", "\x01", strbytelen (str)); % Look for TEXT in %
#d preface
#d -1 -1
#d 0 0
#d 1 1
#d 2 2
#d 3 3
#d 4 4
#d 5 5
#d 6 6
#d 7 7
#d 8 8
#d 9 9
#d NULL NULL
#d documentstyle book
#%}}}
#d module#1 \tt{$1}
#d file#1 \tt{$1}
#d slang-documentation \
\url{http://www.jedsoft.org/slang/doc/html/slang.html}{S-Lang documentation}
\linuxdoc
\begin{\documentstyle}
\title S-Lang cURL Module Reference
\author John E. Davis, \tt{jed@jedsoft.org}
\date \__today__
#i local.tm
\toc
\chapter{Introduction to the cURL Module}
The S-Lang \module{curl} module makes use of the \cURL library to
provide the \slang interpreter the ability to transfer files in a
simple but robust manner using a variety of protocols including FTP
and HTTP.
Although there are some minor differences, the functions in
\module{curl} module represent a more or less straightforward mapping
of the underlying \cURL library. As such, the user the user is
strongly encouraged to read the \url{\curldocs}{excellent,
well-written documentation} for the \cURL library, which even
includes a tutorial. Moreover, anyone familiar with the \cURL API
should have no problems using the \module{curl}.
Currently the module provides \slang interfaces to the so-called
\cURL ``easy'' and ``multi'' class of functions, which permit
sequential and asynchronous file transfers, respectively.
All functions in the module have names that start with \exmp{curl_}.
Functions in the ``multi'' interface begin with \exmp{curl_multi_}.
Before the module can be used it must first be loaded into the
interpreter using a line such as
#v+
require ("curl");
#v-
\chapter{The Easy Interface}
The ``easy'' interface consists of the functions:
#v+
Curl_Type curl_new (String_Type URL);
curl_perform (Curl_Type obj);
curl_setopt (Curl_Type obj, Int_Type op, ...);
curl_close (Curl_Type obj);
#v-
and allows a \slang script to transfer files in a
simple synchronous manner. For example,
#v+
curl_perform (curl_new ("http://www.jedsoft.org/slang/"));
#v-
will cause the contents of \exmp{http://www.jedsoft.org/slang/} to
be retrieve via the http protocol and then written to the display.
Note that the above example makes two function calls to the
\module{curl} module. The call to \sfun{curl_new} produces an
instance of a \dtype{Curl_Type} object associated with the
specified URL. The resulting \curl object gets passed to the
\sfun{curl_perform} function to be processed. In this case, the
default action of \sfun{curl_perform} causes the URL to be
downloaded and then written to \ivar{stdout}.
The \module{curl} handles the closing and destruction of the
\dtype{Curl_Type} object when the variable attached to it goes
out of scope or gets reassigned. Nevertheless the
\ifun{curl_close} function exists to allow the user to explicitly
destroy the underlying \dtype{Curl_Type} object.
The \ifun{curl_setopt} function may be used to set options or
attributes associated with a \dtype{Curl_Type} object. Such
options influence the actions of \sfun{curl_perform}. For example,
the \exmp{CURLOPT_WRITEFUNCTION} option may be used to have
\sfun{curl_perform} pass the contents of the URL to a specified
function or \em{callback}. To illustrate this, consider a callback
that writes the contents of the URL to a file:
#v+
private define write_callback (fp, data)
{
variable len = bstrlen (data);
if (len != fwrite (data, fp))
return -1;
return 0;
}
#v-
In this function, \exmp{fp} is assumed to be an open file pointer
and \exmp{data} is a binary string (\dtype{BString_Type}). The
callback returns 0 if it successfully wrote the data and -1 if not.
Here is how the callback can be used to download a file in MP3 format:
#v+
variable c = curl_new ("http://some.url.org/quixote.mp3");
variable fp = fopen ("quixote.mp3", "wb");
curl_setopt (c, CURLOPT_WRITEFUNCTION, &write_callback, fp);
curl_perform (c);
() = fclose (fp);
#v-
Often one wants to get the contents of the URL in a \slang variable.
This is easily accomplished via a callback such as:
#v+
private define write_variable_callback (v, data)
{
@v = @v + data;
return 0;
}
#v-
The above callback may be used as follows:
#v+
variable c = curl_new ("http://some.url.org/quixote.mp3");
variable s = "";
curl_setopt (c, CURLOPT_WRITEFUNCTION, &write_variable_callback, &s);
curl_perform (c);
#v-
The \ifun{curl_perform} function passes the reference to the
variable \exmp{s} to the callback function, which then dereferences
for concatenation. After the call to \ifun{curl_perform}, \var{s}
will be set to the contents of the URL.
Errors are handled via exceptions. If an error occurs, e.g., a host
could not be contacted, or the specified URL does not exist, then a
\exc{CurlError} exception will be thrown. Here is an example that
processes a list of URLs and prints an error if one cannot be
retrieved:
#v+
urls = {"http://servantes.fictional.domain/don/quixote.html",
"http://servantes.fictional.domain/sancho/panza.html"};
foreach url (urls)
{
try (e)
{
file = path_basename (url);
fp = fopen (file, "w");
c = curl_new (url);
curl_setopt (c, CURLOPT_WRITEFUNCTION, &write_callback, fp);
curl_perform (c);
() = fclose (fp);
}
catch CurlError:
{
vmessage ("Unable to retrieve %s: %s", url, e.message);
() = remove (file);
}
}
#v-
The URLs in the above example are processed in a sequential manner.
This example will be revisited in the context of the ``multi''
interface where it will be rewritten to perform asynchronous
downloads.
\chapter{The Multi Interface}
The ``multi'' interface permits transfers to take place in an
asynchronous manner. It consists of the functions:
#v+
Curl_Multi_Type curl_multi_new ();
curl_multi_remove_handle (Curl_Multi_Type mobj, Curl_Type obj);
curl_multi_add_handle (Curl_Multi_Type mobj, Curl_Type obj);
curl_multi_close (Curl_Multi_Type mobj);
Int_Type curl_multi_perform (Curl_Multi_Type obj [,Double_Type timeout]);
curl_multi_info_read(Curl_Multi_Type obj);
#v-
A \dtype{Curl_Multi_Type} object is essentially a collection of
\dtype{Curl_Type} objects. As such one cannot understand the
multi-interface without understanding the easy-interface.
As the name suggests, the \ifun{curl_multi_new} function creates an
instance of a \dtype{Curl_Multi_Type} object. The
\ifun{curl_multi_add_handle} function is used to add a
\dtype{Curl_Type} object to the specified
\dtype{Curl_Multi_Type}. Similarly, the
\exmp{curl_multi_remove_handle} is used to remove a \dtype{Curl_Type}.
Although the module automatically destroys the underlying
\dtype{Curl_Multi_Type} object when it goes out of scope, the
\ifun{curl_multi_close} may be used to explicitly perform this
operation.
The \ifun{curl_multi_perform} function is used to carry out the
actions of the \dtype{Curl_Type} objects associated with the
\dtype{Curl_Multi_Type} object. The \ifun{curl_multi_info_read}
may be used to find the result of the \ifun{curl_multi_perform}
function.
To illustrate the use of these functions, consider once again the
last example of the previous section involving the processing of a
list of URLs. Here it is again except written to use the ``multi''
interface:
#v+
urls = {"http://servantes.fictional.domain/don/quixote.html",
"http://servantes.fictional.domain/sancho/panza.html"};
fp_list = Assoc_Type[];
m = curl_multi_new ();
foreach url (urls)
{
file = path_basename (url);
fp = fopen (file, "w");
fp_list [url] = fp;
c = curl_new (url);
curl_setopt (c, CURLOPT_WRITEFUNCTION, &write_callback, fp);
curl_multi_add_handle (m, c);
}
dt = 5.0;
while (last_n = curl_multi_length (m), last_n > 0)
{
n = curl_multi_perform (m, dt);
if (n == last_n)
continue;
while (c = curl_multi_info_read (m, &status), c!=NULL)
{
curl_multi_remove_handle (m, c);
url = curl_get_url (c);
() = fclose (fp_list[url]);
if (status == 0)
vmessage ("Retrieved %s", url);
else
vmessage ("Unable to retrieve %s", url);
}
}
#v-
The above code fragment consists of two stages: The first stage
involves the creation of individual \dtype{Curl_Type} objects via
\ifun{curl_new} and populating the \ifun{Curl_Multi_Type} object
assigned to the variable \exmp{m} using the
the \ifun{curl_multi_add_handle} function. Also during this stage,
files were opened and the resulting file pointers were placed in an
associative array for later use.
The second stage involves a nested ``while'' loop. The outer loop
will continue to run as long as there are still \dtype{Curl_Type}
objects contained in \exmp{m}. The \exmp{curl_multi_length} function
returns the number of such objects. Each time through the loop, the
\exmp{curl_multi_perform} function is called with a time-out value of
5.0 seconds. This means that the function will wait up to 5.0
seconds for input on one of the underlying curl objects before
returning. It returns the number of such objects that are still active.
If that number is less than the number contained in the multi-type
object, then at least one of the objects has finished processing.
The inner-loop of the second stage will execute if the transfer of an
object has taken place. This loop repeatedly calls the
\ifun{curl_multi_info_read} to obtain a completed \dtype{Curl_Type}
object. In the body of the loop, the object is removed from the
multi-type and the file associated with the URL is closed. The
processing status, which is returned by \ifun{curl_multi_info_read}
through its argument list, is also checked at this time.
Although this seems like a lot of complexity compared to the ``easy''
approach taken earlier, the reward is greater. Since the transfers
are performed asynchronously, the time spent downloading the entire
list of URLs can be a fraction of that of the synchronous approach.
\chapter{cURL Module Function Reference}
#i curlfuns.tm
\end{\documentstyle}
slcurl-pre0.2.2-14/doc/tm/helpfile.tm 0000644 0001750 0000062 00000000070 11340307670 016103 0 ustar john staff #i local.tm
#d url#2 $2 ($1)
#d tag#1 $1
#i curlfuns.tm
slcurl-pre0.2.2-14/doc/tm/local.tm 0000644 0001750 0000062 00000000204 11340307670 015404 0 ustar john staff #d curlurl http://curl.haxx.se/libcurl/
#d curldocs http://curl.haxx.se/libcurl/docs.html
#d cURL \url{\curlurl}{cURL}
#d curl cURL
slcurl-pre0.2.2-14/doc/tm/curlfuns.tm 0000644 0001750 0000062 00000030521 11340307670 016160 0 ustar john staff #d curlapi#1:2 \url{http://curl.haxx.se/libcurl/c/$1.html}{\ifarg2{$1}{$2}}
\function{curl_new}
\synopsis{Instantiate a new Curl_Type object}
\usage{Curl_Type curl_new(String_Type url)}
\description
This function instantiates and returns a \dtype{Curl_Type} and
returns it. It is a wrapper around the \cURL library function
\exmp{curl_easy_init}. The \dtype{Curl_Type} object is created with
the \icon{CURLOPT_NOPROGRESS} option set to 1, and
\icon{CURLOPT_VERBOSE} set to 0.
Upon failure, the function throws a \exc{CurlError} exception.
\seealso{curl_setopt, curl_multi_new, curl_perform}
\done
\function{curl_setopt}
\synopsis{Set an option for a specified Curl_Type object}
\usage{curl_setopt (Curl_Type c, Int_Type opt, ...)}
\description
The \ifun{curl_setopt} function is a wrapper around the \cURL
library function \curlapi{curl_easy_setopt}. For more information
about the options that this function takes, see
\curlapi{curl_easy_setopt}. Only the differences between the
module function and the corresponding API function will be explained
here.
The current version of the \module{curl} module does not support the
\icon{CURLOPT_*DATA} options. Instead, support for these options
has been integrated into the corresponding callback functions. For
example, the \icon{CURLOPT_WRITEDATA} option has been merged with
the \icon{CURLOPT_WRITEFUNCTION}. Moreover the prototypes for the
callbacks have been changed to simplify their use, as described below.
\begin{descrip}
\tag{CURLOPT_WRITEFUNCTION} This option requires two parameters: a
reference to the callback function, and a user-defined object to
pass to that function. The callback function will be passed two
arguments: the specified user-defined object, and a binary string to
write. Upon failure, the function must return -1, and any other
value will indicate success.
\tag{CURLOPT_READFUNCTION} This option requires two parameters: a
reference to the callback function, and a user-defined object to
pass to that function. The callback function will be passed two
arguments: the specified user-defined object, and the maximum number
of bytes to be read by the function. Upon success, the function
should return a (binary) string, otherwise it should return \NULL to
indicate failure.
\tag{CURLOPT_WRITEHEADER} This option requires two parameters: a
reference to the callback function, and a user-defined object to
pass to that function. The callback function will be passed two
arguments: the specified user-defined object, and a header string
write. The function must return -1 upon failure, or any other
integer to indicate success.
\tag{CURLOPT_PROGRESSFUNCTION} This option requires two parameters: a
reference to the callback function, and a user-defined object to
pass to that function. The callback function will be passed five
arguments: the specified user-defined object, and four double
precision floating point values that represent the total number of
bytes to be downloaded, the total downloaded so far, the total to be
uploaded, and the total currently uploaded. This function must
return 0 to indicate success, or non-zero to indicate failure.
\end{descrip}
A number of the options in the \cURL API take a linked list of
strings. Instead of a linked list, the module requires an array of
strings for such options, e.g.,
#v+
curl_setopt (c, CURLOPT_HTTPHEADER,
["User-Agent: S-Lang curl module",
"Content-Type: text/xml; charset=UTF-8",
"Content-Length: 1234"]);
#v-
\example
The following example illustrates how to write the contents of a
specified URL to a file, its download progress to \icon{stdout}, and
the contents of its header to variable:
#v+
define write_callback (fp, str)
{
return fputs (str, fp);
}
define progress_callback (fp, dltotal, dlnow, ultotal, ulnow)
{
if (-1 == fprintf (fp, "Bytes Received: %d\n", int(dlnow)))
return -1;
if (dltotal > 0.0)
{
if (-1 == fprintf (fp, "Percent Received: %g\n",
dlnow/dltotal * 100.0))
return -1;
}
return 0;
}
define header_callback (strp, str)
{
@strp += str;
return 0;
}
define download_url (url, file)
{
variable fp = fopen (file, "w");
variable c = curl_new (url);
curl_setopt (c, CURLOPT_FOLLOWLOCATION);
curl_setopt (c, CURLOPT_WRITEFUNCTION, &write_callback, fp);
curl_setopt (c, CURLOPT_PROGRESSFUNCTION, &progress_callback, stdout);
variable var = "";
curl_setopt (c, CURLOPT_HEADERFUNCTION, &header_callback, &var);
curl_perform (c);
() = fprintf (stdout, "Header: %s\n", var);
}
#v-
\seealso{curl_new, curl_perform, curl_multi_new}
\done
\function{curl_global_init}
\synopsis{Initialize the Curl library}
\usage{curl_global_init (flags)}
\description
This function is a wrapper around the corresponding \cURL library
function. See \curlapi{curl_global_init}{its documentation} for
more information.
\seealso{curl_global_cleanup}
\done
\function{curl_global_cleanup}
\synopsis{Finalize the Curl library}
\usage{curl_global_cleanup}
\description
This function is a wrapper around the corresponding \cURL library
function. See \curlapi{curl_global_cleanup}{its documentation} for
more information.
\seealso{curl_global_init}
\done
\function{curl_perform}
\synopsis{Transfer a file}
\usage{curl_perform}
\description
This function is a wrapper around the \curlapi{curl_easy_perform}
\cURL library function. See \curlapi{curl_easy_perform}{its
documentation} for more information.
\seealso{curl_new, curl_setopt, curl_multi_perform}
\done
\function{curl_get_info}
\synopsis{Get information about a Curl_Type object}
\usage{info = curl_get_info (Curl_Type c, Int_Type type)}
\description
This function returns information of the requested type from a
\dtype{Curl_Type} object. The data returned depends upon the value
of the \exmp{type} argument. For more information, see see the
documentation for the \cURL library \curlapi{curl_easy_getinfo} function.
\example
This example shows how to use the \ifun{curl_get_info} function to
obtain the effective URL used for the transfer.
#v+
url = curl_get_info (c, CURLINFO_EFFECTIVE_URL);
#v-
\seealso{curl_new, curl_multi_info_read}
\done
\function{curl_close}
\synopsis{Close a Curl_Type object}
\usage{curl_close}
\description
This function is a wrapper around the \curlapi{curl_easy_cleanup}
\cURL library function. See \curlapi{curl_easy_perform}{its
documentation} for more information.
\notes
Normally there is no need to call this function because the module
automatically frees any memory associated with the \dtype{Curl_Type}
object when it is no longer referenced.
\seealso{curl_new}
\done
\function{curl_easy_strerror}
\synopsis{Get the string representation for a curl error code}
\usage{String_Type curl_easy_strerror (errcode)}
\description
This function is a wrapper around the \curlapi{curl_easy_strerror}
\cURL library function. See \curlapi{curl_easy_strerr}{its
documentation} for more information.
\seealso{curl_perform, curl_multi_info_read, curl_multi_perform}
\done
\function{curl_strerror}
\synopsis{Get the string representation for a curl error code}
\usage{String_Type curl_strerror (errcode)}
\description
This function is a wrapper around the \curlapi{curl_easy_strerror}
\cURL library function. See \curlapi{curl_easy_strerr}{its
documentation} for more information.
\seealso{curl_perform, curl_multi_info_read, curl_multi_perform}
\done
\function{curl_multi_new}
\synopsis{Instantiate a new Curl_Multi_Type object}
\usage{Curl_Multi_Type curl_multi_new ()}
\description
This function is a wrapper around the \curlapi{curl_multi_init}
\cURL library function. It creates a new instance of a
\dtype{Curl_Multi_Type} object and returns it.
\seealso{curl_multi_perform, curl_setopt}
\done
\function{curl_multi_perform}
\synopsis{Process a Curl_Multi_Type object}
\usage{Int_Type curl_multi_perform (Curl_Multi_Type m [,Double_Type dt])}
\description
This function is a wrapper around the \curlapi{curl_multi_perform}
\cURL library function. However, the \module{curl} module function
takes an additional argument (\exmp{dt}) that causes the function to
wait up to that many seconds for one of the underlying
\dtype{Curl_Type} objects to become ready for reading or writing.
The function returns the number of \dtype{Curl_Type}.
\seealso{curl_multi_new, curl_multi_length, curl_multi_add_handle}
\done
\function{curl_multi_remove_handle}
\synopsis{Remove a Curl_Type object from a Curl_Multi_Type}
\usage{curl_multi_remove_handle (Curl_Multi_Type m, Curl_Type c)}
\description
This function removes the specified \dtype{Curl_Type} object from
the \dtype{Curl_Multi_Type} object. For more information, see the
\curlapi{curl_multi_remove_handle}{documentation} for the
corresponding \cURL library function.
\seealso{curl_multi_add_handle, curl_multi_new, curl_multi_perform}
\done
\function{curl_multi_add_handle}
\synopsis{Add a Curl_Type object to a Curl_Multi_Type}
\usage{curl_multi_add_handle}
\description
This function adds the specified \dtype{Curl_Type} object to
the \dtype{Curl_Multi_Type} object. For more information, see the
\curlapi{curl_multi_remove_handle}{documentation} for the
corresponding \cURL library function.
\seealso{curl_multi_remove_handle, curl_multi_new, curl_multi_perform}
\done
\function{curl_multi_close}
\synopsis{Close a Curl_Multi_Type object}
\usage{curl_multi_close (Curl_Multi_Type m)}
\description
This function is a wrapper around the \curlapi{curl_multi_cleanup}
\cURL library function. Any \dtype{Curl_Multi_Type} objects
associated with the specified \dtype{Curl_Multi_Type} object will be
removed from it.
\seealso{curl_multi_new, curl_multi_remove_handle, curl_multi_info_read}
\done
\function{curl_multi_info_read}
\synopsis{Get information about a Curl_Multi_Type transfer}
\usage{Curl_Type curl_multi_info_read (Curl_Multi_Type m [,Ref_Type info])}
\description
This function retrieves information from the specified
\dtype{Curl_Multi_Type} object about an individual completed
transfer by one of its associated \dtype{Curl_Type} objects. If all
of the associated \dtype{Curl_Type} objects are still being
processed, the function will return \NULL. Otherwise it returns the
completed \dtype{Curl_Type} object. If an optional \dtype{Ref_Type}
parameter is passed to the function, then upon return the
the associated variable be set to an integer representing the
completion status of the \dtype{Curl_Type} object. If the
completion status is 0, then the transfer was successful, otherwise
the individual transfer failed and the completion status gives the
error code associated with the transfer. More infomation about the
transfer may be obtained by calling the \ifun{curl_get_info} function.
\example
The \ifun{curl_multi_info_read} function should be called after a
call to \ifun{curl_multi_perform} has indicated that a transfer has
taken place. The following example repeatedly calls
\ifun{curl_multi_info_read} until it returns \NULL. Each time
through the loop, the completed \dtype{Curl_Type} object is removed
from the \dtype{Curl_Multi_Type} object.
#v+
while (c = curl_multi_info_read (m, &status), c!=NULL)
{
curl_multi_remove_handle (m, c);
url = curl_get_url (c);
if (status == 0)
vmessage ("Retrieved %s", url);
else
vmessage ("Unable to retrieve %s: Reason %s",
url, curl_strerr (status));
}
#v-
\seealso{curl_multi_perform, curl_multi_remove_handle, curl_get_info}
\done
\function{curl_get_url}
\synopsis{Get the URL associated with a Curl_Type object}
\usage{String_Type curl_get_url (Curl_Type c)}
\description
This function returns the name of the URL that was used to
instantiate the specified \dtype{Curl_Type} object.
\seealso{curl_new, curl_get_info}
\done
\function{curl_multi_length}
\synopsis{Get the number of Curl_Type objects in a Curl_Multi_Type}
\usage{Int_Type curl_multi_length (Curl_Multi_Type m)}
\description
This function returns the number of \dtype{Curl_Type} objects
contained in the specified \dtype{Curl_Multi_Type} object.
\seealso{curl_multi_remove_handle, curl_multi_add_handle}
\done
slcurl-pre0.2.2-14/doc/tm/fixtex.sl 0000644 0001750 0000062 00000004505 11340307670 015627 0 ustar john staff #!/usr/bin/env jed-script
private variable Version = "0.3.2-0";
if (__argc != 2)
{
message ("Version $Version Usage: ./fixtex.sl