Hi,I'M sorry but I've still problems with xmllint on win32. SGML_CATALOG_FILES / xmlLoadCatalogs() can't handle win32 filenames
I've attached a patch which solves the problem. I know it's not commitable as I just changed it that 'it is working' because I don't know the internals of libxml
Can you please take a look on this and add a proper fix to libxml2? Thx, Christian Ehrlicher
Index: catalog.c =================================================================== --- catalog.c (revision 3576) +++ catalog.c (working copy) @@ -44,6 +44,12 @@ #define MAX_DELEGATE 50 #define MAX_CATAL_DEPTH 50 +#ifdef _WIN32 +# define PATH_SEAPARATOR ';' +#else +# define PATH_SEAPARATOR ':' +#endif + /** * TODO: * @@ -3209,6 +3215,9 @@ const char *cur; const char *paths; xmlChar *path; +#ifdef _WIN32 + int i, iLen; +#endif if (pathss == NULL) return; @@ -3218,15 +3227,21 @@ while (xmlIsBlank_ch(*cur)) cur++; if (*cur != 0) { paths = cur; - while ((*cur != 0) && (*cur != ':') && (!xmlIsBlank_ch(*cur))) + while ((*cur != 0) && (*cur != PATH_SEAPARATOR) && (!xmlIsBlank_ch(*cur))) cur++; path = xmlStrndup((const xmlChar *)paths, cur - paths); - if (path != NULL) { +#ifdef _WIN32 + iLen = strlen(path); + for(i = 0; i < iLen; i++) + if(path[i] == '\\') + path[i] = '/'; +#endif + if (path != NULL) { xmlLoadCatalog((const char *) path); xmlFree(path); } } - while (*cur == ':') + while (*cur == PATH_SEAPARATOR) cur++; } } Index: uri.c =================================================================== --- uri.c (revision 3576) +++ uri.c (working copy) @@ -435,6 +435,9 @@ if ((IS_UNRESERVED(*(p))) || ((*(p) == '/')) || ((*(p) == ';')) || ((*(p) == '@')) || ((*(p) == '&')) || ((*(p) == '=')) || ((*(p) == '+')) || ((*(p) == '$')) || +#ifdef WIN32 + ((*(p) == ':')) || +#endif ((*(p) == ','))) ret[len++] = *p++; else { @@ -1156,6 +1159,18 @@ cur = *str; if (!IS_ALPHA(*cur)) return(2); +#ifdef _WIN32 + // check for windows path + if (cur[1] == ':') { + int ret; + if (uri->scheme != NULL) + xmlFree(uri->scheme); + uri->scheme = STRNDUP("file", 4); + ret = xmlParseURIPathSegments(uri, &cur, 1); + *str = cur; + return ret; + } +#endif cur++; while (IS_SCHEME(*cur)) cur++; if (uri != NULL) { @@ -1656,6 +1671,8 @@ ret = xmlParseURIScheme(uri, str); if (ret != 0) return(ret); + if (uri->path && *uri->path) + return ret; if (**str != ':') { *str = cur; return(1); Index: xmllint.c =================================================================== --- xmllint.c (revision 3576) +++ xmllint.c (working copy) @@ -209,6 +209,11 @@ * * ************************************************************************/ #define MAX_PATHS 64 +#ifdef _WIN32 +# define PATH_SEPARATOR ';' +#else +# define PATH_SEPARATOR ':' +#endif static xmlChar *paths[MAX_PATHS + 1]; static int nbpaths = 0; static int load_trace = 0; @@ -225,10 +230,10 @@ return; } cur = path; - while ((*cur == ' ') || (*cur == ':')) + while ((*cur == ' ') || (*cur == PATH_SEPARATOR)) cur++; path = cur; - while ((*cur != 0) && (*cur != ' ') && (*cur != ':')) + while ((*cur != 0) && (*cur != ' ') && (*cur != PATH_SEPARATOR)) cur++; if (cur != path) { paths[nbpaths] = xmlStrndup(path, cur - path);
Attachment:
signature.asc
Description: OpenPGP digital signature