diff options
author | Carlos Garcia Campos <carlosgc@gnome.org> | 2007-12-20 10:12:52 (GMT) |
---|---|---|
committer | Carlos Garcia Campos <carlosgc@src.gnome.org> | 2007-12-20 10:12:52 (GMT) |
commit | d24b16f917ca749e9ffebbec8eca0ee791e1b67a (patch) | |
tree | 73e060f65da7cdc5fb5dd7491d3b8e526e384792 /backend/dvi/mdvi-lib/util.c | |
parent | 945efc9392d4c4b5d6a211ed4ccac376bf8c3066 (diff) |
Add ps specials support in dvi backend when libspectre is present. Fixes
2007-12-20 Carlos Garcia Campos <carlosgc@gnome.org>
* backend/dvi/Makefile.am:
* backend/dvi/cairo-device.c: (dvi_cairo_draw_ps),
(mdvi_cairo_device_init):
* backend/dvi/mdvi-lib/common.h:
* backend/dvi/mdvi-lib/mdvi.h:
* backend/dvi/mdvi-lib/sp-epsf.c: (epsf_special):
* backend/dvi/mdvi-lib/util.c: (mdvi_strrstr),
(mdvi_build_path_from_cwd):
Add ps specials support in dvi backend when libspectre is
present. Fixes bug #386005.
svn path=/trunk/; revision=2775
Diffstat (limited to 'backend/dvi/mdvi-lib/util.c')
-rw-r--r-- | backend/dvi/mdvi-lib/util.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/backend/dvi/mdvi-lib/util.c b/backend/dvi/mdvi-lib/util.c index c1cc649..788b774 100644 --- a/backend/dvi/mdvi-lib/util.c +++ b/backend/dvi/mdvi-lib/util.c @@ -288,6 +288,60 @@ void *mdvi_memdup(const void *data, size_t length) return ptr; } +char *mdvi_strrstr (const char *haystack, const char *needle) +{ + size_t i; + size_t needle_len; + size_t haystack_len; + const char *p; + + needle_len = strlen (needle); + haystack_len = strlen (haystack); + + if (needle_len == 0) + return NULL; + + if (haystack_len < needle_len) + return (char *)haystack; + + p = haystack + haystack_len - needle_len; + while (p >= haystack) { + for (i = 0; i < needle_len; i++) + if (p[i] != needle[i]) + goto next; + + return (char *)p; + + next: + p--; + } + + return NULL; +} + +char *mdvi_build_path_from_cwd (const char *path) +{ + char *ptr; + char *buf = NULL; + size_t buf_size = 512; + + while (1) { + buf = mdvi_realloc (buf, buf_size); + if ((ptr = getcwd (buf, buf_size)) == NULL && errno == ERANGE) { + buf_size *= 2; + } else { + buf = ptr; + break; + } + } + + buf = mdvi_realloc (buf, strlen (buf) + strlen (path) + 2); + strcat (buf, "/"); + strncat (buf, path, strlen (path)); + + return buf; +} + double unit2pix_factor(const char *spec) { double val; |