uri.h (2795B)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | #ifndef URI_H_
#define URI_H_
#include "str.h"
enum uri_protocol
{
/* The protocol is not one thatwe understand. */
PROTOCOL_UNSUPPORTED = -1,
PROTOCOL_NONE = 0,
/*
* Protocols that have slashes:
* gopher://example.com
*/
PROTOCOL_GOPHER,
//PROTOCOL_GEMINI,
PROTOCOL_FILE,
/*
* Protocols that do not have slashes:
* internal:history
* mailto:info@example.com
*/
#define PROTOCOL_NO_SLASHES_FIRST SUPPORTED_PROTOCOL_COUNT //PROTOCOL_INTERNAL
//PROTOCOL_INTERNAL,
//PROTOCOL_MAILTO,
//PROTOCOL_MAGNET,
SUPPORTED_PROTOCOL_COUNT
};
static const char *const SUPPORTED_PROTOCOL_NAMES[SUPPORTED_PROTOCOL_COUNT] =
{
[PROTOCOL_NONE] = "",
[PROTOCOL_GOPHER] = "gopher",
[PROTOCOL_FILE] = "file",
};
/* Lookup supported protocol by name */
static inline enum uri_protocol
uri_protocol_lookup(const char *s, size_t n)
{
int i;
for (i = 0; i < SUPPORTED_PROTOCOL_COUNT; ++i)
{
ASSERT(SUPPORTED_PROTOCOL_NAMES[i] && "unnamed protocol");
if (str_equal(s, SUPPORTED_PROTOCOL_NAMES[i], n))
return (enum uri_protocol)i;
}
return PROTOCOL_UNSUPPORTED;
}
static inline bool
uri_protocol_has_slashes(enum uri_protocol p)
{
ASSERT(p != PROTOCOL_UNSUPPORTED && "unsupported protocol");
ASSERT(p > PROTOCOL_NONE &&
p < SUPPORTED_PROTOCOL_COUNT && "invalid protocol");
return p < PROTOCOL_NO_SLASHES_FIRST;
}
#define URI_NO_PROTOCOL_SLASHES_BIT 0x01 /* URI protocol has no slashes.
* e.g. mailto: and internal: URIs. */
struct uri
{
uint32_t flags;
int port;
enum uri_protocol protocol;
char protocol_str[16]; /* protocol (no colon or slashes) */
char host[256]; /* includes at-sign (@) for mailto */
char path[512];
char query[256];
};
/* Parse URI from string */
struct uri uri_parse(const char *uristr, int uristr_len);
/* uristr flags */
#define URISTR_NO_PORT_BIT 0x01 /* exclude port from the string */
#define URISTR_FANCY_BIT 0x02 /* fancy URI styling/colouring */
#define URISTR_NOSCHEME_BIT 0x04 /* omit protocol/scheme */
#define URISTR_NOSLASH_BIT 0x08 /* omit trailing slash from path */
#define URISTR_NOGITEM_BIT 0x10 /* omit gopher item type */
#define URISTR_NOQUERY_BIT 0x20 /* omit query */
/* Convert URI to string */
size_t uri_str(char *b,
const struct uri *const u,
size_t b_size,
uint32_t flags);
/* urieq flags */
#define URIEQ_IGNORE_TRAILING_SLASH_BIT 0x01
#define URIEQ_IGNORE_QUERY_BIT 0x02
/* @return true if URIs are equal */
bool uri_equal(struct uri u1, struct uri u2, uint32_t flags);
#endif
|