diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2013-06-19 15:29:44 +0200 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2013-06-20 16:45:35 +0200 |
commit | 0a927854a10e1e6b9770a81e2e1d9f3093631757 (patch) | |
tree | 3d65d820d9fdba2d0d394d99c36290c851b78ca0 /xps/xps_util.c | |
parent | 1ae8f19179c5f0f8c6352b3c7855465325d5449a (diff) | |
download | mupdf-0a927854a10e1e6b9770a81e2e1d9f3093631757.tar.xz |
Rearrange source files.
Diffstat (limited to 'xps/xps_util.c')
-rw-r--r-- | xps/xps_util.c | 165 |
1 files changed, 0 insertions, 165 deletions
diff --git a/xps/xps_util.c b/xps/xps_util.c deleted file mode 100644 index a74dc30f..00000000 --- a/xps/xps_util.c +++ /dev/null @@ -1,165 +0,0 @@ -#include "mupdf/xps.h" - -static inline int xps_tolower(int c) -{ - if (c >= 'A' && c <= 'Z') - return c + 32; - return c; -} - -int -xps_strcasecmp(char *a, char *b) -{ - while (xps_tolower(*a) == xps_tolower(*b)) - { - if (*a++ == 0) - return 0; - b++; - } - return xps_tolower(*a) - xps_tolower(*b); -} - -/* A URL is defined as consisting of a: - * SCHEME (e.g. http:) - * AUTHORITY (username, password, hostname, port, eg //test:passwd@mupdf.com:999) - * PATH (e.g. /download) - * QUERY (e.g. ?view=page) - * FRAGMENT (e.g. #fred) (not strictly part of the URL) - */ -static char * -skip_scheme(char *path) -{ - char *p = path; - - /* Skip over: alpha *(alpha | digit | "+" | "-" | ".") looking for : */ - if (*p >= 'a' && *p <= 'z') - {} - else if (*p >= 'A' && *p <= 'Z') - {} - else - return path; - - while (*++p) - { - if (*p >= 'a' && *p <= 'z') - {} - else if (*p >= 'A' && *p <= 'Z') - {} - else if (*p >= '0' && *p <= '9') - {} - else if (*p == '+') - {} - else if (*p == '-') - {} - else if (*p == '.') - {} - else if (*p == ':') - return p+1; - else - break; - } - return path; -} - -static char * -skip_authority(char *path) -{ - char *p = path; - - /* Authority section must start with '//' */ - if (p[0] != '/' || p[1] != '/') - return path; - p += 2; - - /* Authority is terminated by end of URL, '/' or '?' */ - while (*p && *p != '/' && *p != '?') - p++; - - return p; -} - -#define SEP(x) ((x)=='/' || (x) == 0) - -static char * -xps_clean_path(char *name) -{ - char *p, *q, *dotdot, *start; - int rooted; - - start = skip_scheme(name); - start = skip_authority(start); - rooted = start[0] == '/'; - - /* - * invariants: - * p points at beginning of path element we're considering. - * q points just past the last path element we wrote (no slash). - * dotdot points just past the point where .. cannot backtrack - * any further (no slash). - */ - p = q = dotdot = start + rooted; - while (*p) - { - if(p[0] == '/') /* null element */ - p++; - else if (p[0] == '.' && SEP(p[1])) - p += 1; /* don't count the separator in case it is nul */ - else if (p[0] == '.' && p[1] == '.' && SEP(p[2])) - { - p += 2; - if (q > dotdot) /* can backtrack */ - { - while(--q > dotdot && *q != '/') - ; - } - else if (!rooted) /* /.. is / but ./../ is .. */ - { - if (q != start) - *q++ = '/'; - *q++ = '.'; - *q++ = '.'; - dotdot = q; - } - } - else /* real path element */ - { - if (q != start+rooted) - *q++ = '/'; - while ((*q = *p) != '/' && *q != 0) - p++, q++; - } - } - - if (q == start) /* empty string is really "." */ - *q++ = '.'; - *q = '\0'; - - return name; -} - -void -xps_resolve_url(char *output, char *base_uri, char *path, int output_size) -{ - char *p = skip_authority(skip_scheme(path)); - - if (p != path || path[0] == '/') - { - fz_strlcpy(output, path, output_size); - } - else - { - int len = fz_strlcpy(output, base_uri, output_size); - if (len == 0 || output[len-1] != '/') - fz_strlcat(output, "/", output_size); - fz_strlcat(output, path, output_size); - } - xps_clean_path(output); -} - -int -xps_url_is_remote(char *path) -{ - char *p = skip_authority(skip_scheme(path)); - - return p != path; -} |