From: Pierre Habouzit Date: Sun, 12 Nov 2006 16:21:35 +0000 (+0100) Subject: move url.[hc] into the lib-lib. X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=commitdiff_plain;h=3e9a92ab72e04aecb0fc4098098a1b57c5101d84 move url.[hc] into the lib-lib. move parse_mailto into the lib-mime Signed-off-by: Pierre Habouzit --- diff --git a/Makefile.am b/Makefile.am index 9d2ae40..8edfb70 100644 --- a/Makefile.am +++ b/Makefile.am @@ -25,7 +25,7 @@ madmutt_SOURCES = $(BUILT_SOURCES) \ pager.c pattern.c postpone.c query.c \ recvattach.c recvcmd.c rfc1524.c rfc3676.c \ score.c send.c sendlib.c sidebar.c sort.c state.c status.c \ - thread.c url.c utf8.c wcwidth.c account.c + thread.c utf8.c wcwidth.c account.c madmutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ \ -Limap -limap -Lpop -lpop $(LIBNNTP) \ @@ -61,7 +61,7 @@ CPPFLAGS=@CPPFLAGS@ -I$(includedir) EXTRA_madmutt_SOURCES = \ account.c mutt_sasl.c dotlock.c remailer.c \ - alias.h browser.h mbyte.h remailer.h url.h state.h \ + alias.h browser.h mbyte.h remailer.h state.h \ mutt_idna.h mutt_libesmtp.c sidebar.h state.h EXTRA_DIST = config.rpath COPYRIGHT GPL OPS OPS.PGP OPS.CRYPT OPS.SMIME TODO \ diff --git a/account.c b/account.c index c4eb502..dc12bc6 100644 --- a/account.c +++ b/account.c @@ -17,13 +17,12 @@ #include #include #include +#include #include #include "mutt.h" #include "account.h" -#include "url.h" - /* mutt_account_match: compare account info (host/port/user/login) */ int mutt_account_match (const ACCOUNT * a1, const ACCOUNT * a2) diff --git a/account.h b/account.h index 9bbd203..a838b67 100644 --- a/account.h +++ b/account.h @@ -12,7 +12,7 @@ #ifndef _MUTT_ACCOUNT_H_ #define _MUTT_ACCOUNT_H_ 1 -#include "url.h" +#include /* account types */ enum { diff --git a/imap/mx_imap.c b/imap/mx_imap.c index f3bb4f3..d622a47 100644 --- a/imap/mx_imap.c +++ b/imap/mx_imap.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "mutt.h" #include "imap_private.h" @@ -20,7 +21,6 @@ #include "mx_imap.h" -#include "url.h" int imap_is_magic (const char* path, struct stat* st) { url_scheme_t s; diff --git a/imap/util.c b/imap/util.c index 373cad0..c14c72b 100644 --- a/imap/util.c +++ b/imap/util.c @@ -15,10 +15,10 @@ #include #include +#include #include "mutt.h" #include "mx.h" /* for M_IMAP */ -#include "url.h" #include "imap_private.h" #include diff --git a/lib-crypt/pgp.c b/lib-crypt/pgp.c index e90943d..0a35e6b 100644 --- a/lib-crypt/pgp.c +++ b/lib-crypt/pgp.c @@ -420,7 +420,6 @@ int pgp_application_pgp_handler (BODY * m, STATE * s) } else if (pgpout) { FGETCONV *fc; - int c; rewind (pgpout); state_set_prefix (s); diff --git a/lib-lib/Makefile.am b/lib-lib/Makefile.am index 89120e3..035dcba 100644 --- a/lib-lib/Makefile.am +++ b/lib-lib/Makefile.am @@ -3,10 +3,10 @@ noinst_LIBRARIES = liblib.a liblib_a_SOURCES = mem.h str.h ascii.h buffer.h hash.h list.h file.h mapping.h \ str.c ascii.c buffer.c hash.c list.c file.c mapping.c \ \ - date.h debug.h rx.h \ - date.c debug.c rx.c + date.h debug.h rx.h url.h \ + date.c debug.c rx.c url.c noinst_HEADERS = mem.h str.h ascii.h buffer.h hash.h list.h file.h mapping.h \ - date.h debug.h rx.h + date.h debug.h rx.h url.h -include ../cflags.mk diff --git a/lib-lib/url.c b/lib-lib/url.c new file mode 100644 index 0000000..afc444b --- /dev/null +++ b/lib-lib/url.c @@ -0,0 +1,193 @@ +/* + * This program 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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + * Copyright © 2006 Pierre Habouzit + */ +/* + * Copyright notice from original mutt: + * Copyright (C) 2000 Thomas Roessler + * + * This file is part of mutt-ng, see http://www.muttng.org/. + * It's licensed under the GNU General Public License, + * please see the file GPL in the top level source directory. + */ + +/* + * A simple URL parser. + */ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include +#include +#include +#include + +#include + +#include "mutt.h" + +static struct mapping_t UrlMap[] = { + {"file", U_FILE}, + {"imap", U_IMAP}, + {"imaps", U_IMAPS}, + {"pop", U_POP}, + {"pops", U_POPS}, + {"nntp", U_NNTP}, + {"news", U_NNTP}, + {"nntps", U_NNTPS}, + {"snews", U_NNTPS}, + {"mailto", U_MAILTO}, + {NULL, U_UNKNOWN} +}; + +/* decode url escaping */ +char *url_decode(char *p) +{ + char *q = p; + + if (!p) + return NULL; + + while (*q) { + if (*q == '%' && hexval(q[1]) >= 0 && hexval(q[2]) >= 0) { + *p++ = (hexval(q[1]) << 4) | hexval(q[2]); + q += 3; + } else { + *p++ = *q++; + } + } + + *p = '\0'; + return p; +} + +url_scheme_t url_check_scheme(const char *s) +{ + char sbuf[STRING]; + char *t; + int i; + + if (!s || !(t = strchr(s, ':'))) + return U_UNKNOWN; + + m_strncpy(sbuf, sizeof(sbuf), s, t - s); + i = mutt_getvaluebyname(sbuf, UrlMap); + return i == -1 ? U_UNKNOWN : i; +} + +/* ciss_parse_userhost: fill in components of ciss with info from src. Note + * these are pointers into src, which is altered with '\0's. Port of 0 + * means no port given. + * FIXME: THIS IS TASTELESS + */ +static char *ciss_parse_userhost(ciss_url_t *ciss, char *src) +{ + char *t; + char *p; + char *path; + + ciss->user = NULL; + ciss->pass = NULL; + ciss->host = NULL; + ciss->port = 0; + + if (strncmp(src, "//", 2)) + return src; + + src += 2; + + if ((path = strchr(src, '/'))) + *path++ = '\0'; + + if ((t = strrchr(src, '@'))) { + *t = '\0'; + if ((p = strchr (src, ':'))) { + *p = '\0'; + ciss->pass = p + 1; + url_decode (ciss->pass); + } + ciss->user = src; + url_decode (ciss->user); + t++; + } + else + t = src; + + if ((p = strchr (t, ':'))) { + *p++ = '\0'; + ciss->port = atoi (p); + } + else + ciss->port = 0; + + ciss->host = t; + url_decode(ciss->host); + return path; +} + +/* url_parse_ciss: Fill in ciss_url_t. char* elements are pointers into src, + * which is modified by this call (duplicate it first if you need to). + * FIXME: THIS IS TASTELESS + */ +int url_parse_ciss(ciss_url_t *ciss, char *src) +{ + ciss->scheme = url_check_scheme(src); + if (ciss->scheme == U_UNKNOWN) + return -1; + + ciss->path = ciss_parse_userhost(ciss, strchr(src, ':') + 1); + url_decode(ciss->path); + + return 0; +} + +/* url_ciss_tostring: output the URL string for a given CISS object. */ +int url_ciss_tostring(ciss_url_t *ciss, char *dst, ssize_t len, int flags) +{ + ssize_t l = 0; + + if (ciss->scheme == U_UNKNOWN) + return -1; + + snprintf(dst, len, "%s:", mutt_getnamebyvalue(ciss->scheme, UrlMap)); + + if (ciss->host) { + l = m_strcat(dst, len, "//"); + + if (ciss->user) { + if ((flags & U_DECODE_PASSWD) && ciss->pass) { + l += snprintf(dst + l, len - l, "%s:%s@", ciss->user, ciss->pass); + } else { + l += snprintf(dst + l, len - l, "%s@", ciss->user); + } + } + + if (ciss->port) { + l += snprintf(dst + l, len - l, "%s:%hu/", ciss->host, ciss->port); + } else { + l += snprintf(dst + l, len - l, "%s/", ciss->host); + } + } + + l += m_strcpy(dst + l, len - l, ciss->path); + + return 0; +} diff --git a/lib-lib/url.h b/lib-lib/url.h new file mode 100644 index 0000000..3078ebd --- /dev/null +++ b/lib-lib/url.h @@ -0,0 +1,59 @@ +/* + * This program 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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + * Copyright © 2006 Pierre Habouzit + */ +/* + * This file is part of mutt-ng, see http://www.muttng.org/. + * It's licensed under the GNU General Public License, + * please see the file GPL in the top level source directory. + */ + +#ifndef MUTT_LIB_LIB_URL_H +#define MUTT_LIB_LIB_URL_H + +#include + +typedef enum url_scheme { + U_FILE, + U_POP, + U_POPS, + U_IMAP, + U_IMAPS, + U_NNTP, + U_NNTPS, + U_MAILTO, + U_UNKNOWN +} url_scheme_t; + +#define U_DECODE_PASSWD (1) + +typedef struct ciss_url { + url_scheme_t scheme; + char *user; + char *pass; + char *host; + int port; + char *path; +} ciss_url_t; + +char *url_decode(char *); + +url_scheme_t url_check_scheme (const char *s); +int url_parse_ciss(ciss_url_t *ciss, char *src); +int url_ciss_tostring(ciss_url_t *ciss, char *dst, ssize_t len, int flags); + +#endif /* MUTT_LIB_LIB_URL_H */ diff --git a/lib-mime/mime.c b/lib-mime/mime.c index 2311083..fdb2935 100644 --- a/lib-mime/mime.c +++ b/lib-mime/mime.c @@ -17,6 +17,9 @@ * Copyright © 2006 Pierre Habouzit */ +#include +#include + #include "mime-types.h" #include "mutt.h" @@ -104,3 +107,63 @@ void header_wipe(HEADER *h) p_delete(&h->data); } +int url_parse_mailto(ENVELOPE *e, char **body, const char *src) +{ + char *t; + char *tmp; + char *headers; + char *tag, *value; + char scratch[HUGE_STRING]; + + int taglen; + + LIST **last = &e->userhdrs; + + if (!(t = strchr (src, ':'))) + return -1; + + if ((tmp = m_strdup(t + 1)) == NULL) + return -1; + + if ((headers = strchr (tmp, '?'))) + *headers++ = '\0'; + + url_decode(tmp); + e->to = rfc822_parse_adrlist (e->to, tmp); + + tag = headers ? strtok (headers, "&") : NULL; + + for (; tag; tag = strtok (NULL, "&")) { + if ((value = strchr (tag, '='))) + *value++ = '\0'; + if (!value || !*value) + continue; + + url_decode (tag); + url_decode (value); + + if (!ascii_strcasecmp (tag, "body")) { + if (body) + m_strreplace(body, value); + } + else { +#define SAFEPFX (option (OPTSTRICTMAILTO) ? "" : "X-Mailto-") + taglen = m_strlen(tag) + m_strlen(SAFEPFX); + /* mutt_parse_rfc822_line makes some assumptions */ + snprintf (scratch, sizeof (scratch), "%s%s: %s", SAFEPFX, tag, value); +#undef SAVEPFX + scratch[taglen] = '\0'; + value = vskipspaces(&scratch[taglen + 1]); + last = mutt_parse_rfc822_line (e, NULL, scratch, value, 0, 0, last); + /* if $strict_mailto is set, force editing headers to let + * users have a look at what we got */ + if (!option (OPTSTRICTMAILTO)) { + set_option (OPTXMAILTO); + set_option (OPTEDITHDRS); + } + } + } + + p_delete(&tmp); + return 0; +} diff --git a/lib-mime/mime.h b/lib-mime/mime.h index 4e678e4..d2b6fd5 100644 --- a/lib-mime/mime.h +++ b/lib-mime/mime.h @@ -51,6 +51,8 @@ extern const char *BodyEncodings[]; #define TYPE(X) ((X->type == TYPEOTHER) && (X->xtype != NULL) ? X->xtype : BodyTypes[(X->type)]) #define ENCODING(X) BodyEncodings[(X)] +int url_parse_mailto(ENVELOPE *e, char **body, const char *src); + /****************************************************************************/ /* RFC 822 */ /* Standard for ARPA Internet Text Messages */ diff --git a/lib-mime/rfc822parse.c b/lib-mime/rfc822parse.c index 732a046..1eee71a 100644 --- a/lib-mime/rfc822parse.c +++ b/lib-mime/rfc822parse.c @@ -39,10 +39,9 @@ #include #include #include +#include #include "recvattach.h" -#include "url.h" - #include "mime.h" diff --git a/main.c b/main.c index 4a735ef..e020974 100644 --- a/main.c +++ b/main.c @@ -32,9 +32,12 @@ #include #include #include +#include #include +#include + #include #include "mutt.h" @@ -43,7 +46,6 @@ #include "sort.h" #include #include "keymap.h" -#include "url.h" #include "mutt_idna.h" #include "xterm.h" diff --git a/muttlib.c b/muttlib.c index 1c54b13..28f6af3 100644 --- a/muttlib.c +++ b/muttlib.c @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -39,7 +40,6 @@ #include "mutt.h" #include "mx.h" -#include "url.h" #include "attach.h" #include "version.h" diff --git a/mx.c b/mx.c index 4aef72f..8e645c1 100644 --- a/mx.c +++ b/mx.c @@ -29,6 +29,7 @@ #include #include #include +#include #include @@ -43,7 +44,6 @@ #include "thread.h" #include "copy.h" #include "keymap.h" -#include "url.h" #include "sidebar.h" #include "compress.h" diff --git a/nntp/mx_nntp.c b/nntp/mx_nntp.c index 675a7aa..e607885 100644 --- a/nntp/mx_nntp.c +++ b/nntp/mx_nntp.c @@ -11,6 +11,7 @@ #include #include +#include #include "mutt.h" #include "nntp.h" @@ -19,7 +20,6 @@ #include "mx_nntp.h" -#include "url.h" static int nntp_is_magic (const char* path, struct stat* st) { url_scheme_t s = url_check_scheme (NONULL (path)); diff --git a/pop/mx_pop.c b/pop/mx_pop.c index 95f2fb6..f30dbbd 100644 --- a/pop/mx_pop.c +++ b/pop/mx_pop.c @@ -11,6 +11,7 @@ #include #include +#include #include "mutt.h" #include "pop.h" @@ -18,9 +19,6 @@ #include "mx.h" #include "mx_pop.h" - -#include "url.h" - static int pop_is_magic (const char* path, struct stat* st) { url_scheme_t s = url_check_scheme (NONULL (path)); return ((s == U_POP || s == U_POPS) ? M_POP : -1); diff --git a/pop/pop_lib.c b/pop/pop_lib.c index 38454ef..b1cab50 100644 --- a/pop/pop_lib.c +++ b/pop/pop_lib.c @@ -20,10 +20,10 @@ #include #include #include +#include #include "mutt.h" #include "mx.h" -#include "url.h" #include "pop.h" #if defined (USE_SSL) || defined (USE_GNUTLS) # include diff --git a/send.c b/send.c index 2cf6550..eb57837 100644 --- a/send.c +++ b/send.c @@ -29,6 +29,7 @@ #include #include #include +#include #include @@ -42,7 +43,6 @@ #include "mx.h" #include #include "mutt_idna.h" -#include "url.h" #include "attach.h" #ifdef USE_NNTP diff --git a/url.c b/url.c deleted file mode 100644 index 39bbec8..0000000 --- a/url.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright notice from original mutt: - * Copyright (C) 2000 Thomas Roessler - * - * This file is part of mutt-ng, see http://www.muttng.org/. - * It's licensed under the GNU General Public License, - * please see the file GPL in the top level source directory. - */ - -/* - * A simple URL parser. - */ - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include - -#include - -#include "mutt.h" -#include "url.h" - - -#include - -static struct mapping_t UrlMap[] = { - {"file", U_FILE}, - {"imap", U_IMAP}, - {"imaps", U_IMAPS}, - {"pop", U_POP}, - {"pops", U_POPS}, - {"nntp", U_NNTP}, - {"news", U_NNTP}, - {"nntps", U_NNTPS}, - {"snews", U_NNTPS}, - {"mailto", U_MAILTO}, - {NULL, U_UNKNOWN} -}; - - -static void url_pct_decode (char *s) -{ - char *d; - - if (!s) - return; - - for (d = s; *s; s++) { - if (*s == '%' && hexval (s[1]) >= 0 && hexval (s[2]) >= 0) { - *d++ = (hexval (s[1]) << 4) | (hexval (s[2])); - s += 2; - } - else - *d++ = *s; - } - *d = '\0'; -} - -url_scheme_t url_check_scheme (const char *s) -{ - char sbuf[STRING]; - char *t; - int i; - - if (!s || !(t = strchr (s, ':'))) - return U_UNKNOWN; - if ((t - s) + 1 >= sizeof (sbuf)) - return U_UNKNOWN; - - m_strcpy(sbuf, t - s + 1, s); - for (t = sbuf; *t; t++) - *t = ascii_tolower (*t); - - if ((i = mutt_getvaluebyname (sbuf, UrlMap)) == -1) - return U_UNKNOWN; - else - return (url_scheme_t) i; -} - -int url_parse_file (char *d, const char *src, size_t dl) -{ - if (ascii_strncasecmp (src, "file:", 5)) - return -1; - else if (!ascii_strncasecmp (src, "file://", 7)) /* we don't support remote files */ - return -1; - else - m_strcpy(d, dl, src + 5); - - url_pct_decode (d); - return 0; -} - -/* ciss_parse_userhost: fill in components of ciss with info from src. Note - * these are pointers into src, which is altered with '\0's. Port of 0 - * means no port given. */ -static char *ciss_parse_userhost (ciss_url_t * ciss, char *src) -{ - char *t; - char *p; - char *path; - - ciss->user = NULL; - ciss->pass = NULL; - ciss->host = NULL; - ciss->port = 0; - - if (strncmp (src, "//", 2)) - return src; - - src += 2; - - if ((path = strchr (src, '/'))) - *path++ = '\0'; - - if ((t = strrchr (src, '@'))) { - *t = '\0'; - if ((p = strchr (src, ':'))) { - *p = '\0'; - ciss->pass = p + 1; - url_pct_decode (ciss->pass); - } - ciss->user = src; - url_pct_decode (ciss->user); - t++; - } - else - t = src; - - if ((p = strchr (t, ':'))) { - *p++ = '\0'; - ciss->port = atoi (p); - } - else - ciss->port = 0; - - ciss->host = t; - url_pct_decode (ciss->host); - return path; -} - -/* url_parse_ciss: Fill in ciss_url_t. char* elements are pointers into src, - * which is modified by this call (duplicate it first if you need to). */ -int url_parse_ciss (ciss_url_t * ciss, char *src) -{ - char *tmp; - - if ((ciss->scheme = url_check_scheme (src)) == U_UNKNOWN) - return -1; - - tmp = strchr (src, ':') + 1; - - ciss->path = ciss_parse_userhost (ciss, tmp); - url_pct_decode (ciss->path); - - return 0; -} - -/* url_ciss_tostring: output the URL string for a given CISS object. */ - -int url_ciss_tostring (ciss_url_t * ciss, char *dest, size_t len, int flags) -{ - long l; - - if (ciss->scheme == U_UNKNOWN) - return -1; - - snprintf (dest, len, "%s:", mutt_getnamebyvalue (ciss->scheme, UrlMap)); - - if (ciss->host) { - m_strcat(dest, len, "//"); - len -= (l = m_strlen(dest)); - dest += l; - - if (ciss->user) { - if (flags & U_DECODE_PASSWD && ciss->pass) - snprintf (dest, len, "%s:%s@", ciss->user, ciss->pass); - else - snprintf (dest, len, "%s@", ciss->user); - - len -= (l = m_strlen(dest)); - dest += l; - } - - if (ciss->port) - snprintf (dest, len, "%s:%hu/", ciss->host, ciss->port); - else - snprintf (dest, len, "%s/", ciss->host); - } - - if (ciss->path) - m_strcat(dest, len, ciss->path); - - return 0; -} - -int url_parse_mailto (ENVELOPE * e, char **body, const char *src) -{ - char *t; - char *tmp; - char *headers; - char *tag, *value; - char scratch[HUGE_STRING]; - - int taglen; - - LIST **last = &e->userhdrs; - - if (!(t = strchr (src, ':'))) - return -1; - - if ((tmp = m_strdup(t + 1)) == NULL) - return -1; - - if ((headers = strchr (tmp, '?'))) - *headers++ = '\0'; - - url_pct_decode (tmp); - e->to = rfc822_parse_adrlist (e->to, tmp); - - tag = headers ? strtok (headers, "&") : NULL; - - for (; tag; tag = strtok (NULL, "&")) { - if ((value = strchr (tag, '='))) - *value++ = '\0'; - if (!value || !*value) - continue; - - url_pct_decode (tag); - url_pct_decode (value); - - if (!ascii_strcasecmp (tag, "body")) { - if (body) - m_strreplace(body, value); - } - else { -#define SAFEPFX (option (OPTSTRICTMAILTO) ? "" : "X-Mailto-") - taglen = m_strlen(tag) + m_strlen(SAFEPFX); - /* mutt_parse_rfc822_line makes some assumptions */ - snprintf (scratch, sizeof (scratch), "%s%s: %s", SAFEPFX, tag, value); -#undef SAVEPFX - scratch[taglen] = '\0'; - value = vskipspaces(&scratch[taglen + 1]); - last = mutt_parse_rfc822_line (e, NULL, scratch, value, 0, 0, last); - /* if $strict_mailto is set, force editing headers to let - * users have a look at what we got */ - if (!option (OPTSTRICTMAILTO)) { - set_option (OPTXMAILTO); - set_option (OPTEDITHDRS); - } - } - } - - p_delete(&tmp); - return 0; -} diff --git a/url.h b/url.h deleted file mode 100644 index fda4e64..0000000 --- a/url.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright notice from original mutt: - * [none] - * - * This file is part of mutt-ng, see http://www.muttng.org/. - * It's licensed under the GNU General Public License, - * please see the file GPL in the top level source directory. - */ - -#ifndef _URL_H -# define _URL_H - -#include - -typedef enum url_scheme { - U_FILE, - U_POP, - U_POPS, - U_IMAP, - U_IMAPS, - U_NNTP, - U_NNTPS, - U_MAILTO, - U_UNKNOWN -} url_scheme_t; - -#define U_DECODE_PASSWD (1) - -typedef struct ciss_url { - url_scheme_t scheme; - char *user; - char *pass; - char *host; - unsigned short port; - char *path; -} ciss_url_t; - -url_scheme_t url_check_scheme (const char *s); -int url_parse_file (char *d, const char *src, size_t dl); -int url_parse_ciss (ciss_url_t * ciss, char *src); -int url_ciss_tostring (ciss_url_t * ciss, char *dest, size_t len, int flags); -int url_parse_mailto (ENVELOPE * e, char **body, const char *src); - -#endif