15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * testURI.c : a small tester program for XML input.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * daniel@veillard.com
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxml.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdarg.h>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/uri.h>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/globals.h>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char *base = NULL;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int escape = 0;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int debug = 0;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void handleURI(const char *str) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlURIPtr uri;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlChar *res = NULL, *parsed = NULL;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uri = xmlCreateURI();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (base == NULL) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	ret = xmlParseURIReference(uri, str);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (ret != 0)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("%s : error %d\n", str, ret);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (debug) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (uri->scheme) printf("scheme: %s\n", uri->scheme);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (uri->opaque) printf("opaque: %s\n", uri->opaque);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (uri->authority) printf("authority: %s\n", uri->authority);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (uri->server) printf("server: %s\n", uri->server);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (uri->user) printf("user: %s\n", uri->user);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (uri->port != 0) printf("port: %d\n", uri->port);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (uri->path) printf("path: %s\n", uri->path);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (uri->query) printf("query: %s\n", uri->query);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (uri->fragment) printf("fragment: %s\n", uri->fragment);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (uri->query_raw) printf("query_raw: %s\n", uri->query_raw);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        if (uri->cleanup != 0) printf("cleanup\n");
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    xmlNormalizeURIPath(uri->path);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (escape != 0) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parsed = xmlSaveUri(uri);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		res = xmlURIEscape(parsed);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf("%s\n", (char *) res);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } else {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		xmlPrintURI(stdout, uri);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		printf("\n");
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	res = xmlBuildURI((xmlChar *)str, (xmlChar *) base);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (res != NULL) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("%s\n", (char *) res);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	else
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    printf("::ERROR::\n");
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (res != NULL)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(res);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (parsed != NULL)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	xmlFree(parsed);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlFreeURI(uri);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main(int argc, char **argv) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i, arg = 1;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((argc > arg) && (argv[arg] != NULL) &&
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((!strcmp(argv[arg], "-base")) || (!strcmp(argv[arg], "--base")))) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	arg++;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	base = argv[arg];
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (base != NULL)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    arg++;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((argc > arg) && (argv[arg] != NULL) &&
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((!strcmp(argv[arg], "-escape")) || (!strcmp(argv[arg], "--escape")))) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	arg++;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	escape++;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((argc > arg) && (argv[arg] != NULL) &&
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	((!strcmp(argv[arg], "-debug")) || (!strcmp(argv[arg], "--debug")))) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	arg++;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	debug++;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (argv[arg] == NULL) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	char str[1024];
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        while (1) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * read one line in string buffer.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    if (fgets (&str[0], sizeof (str) - 1, stdin) == NULL)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       break;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    /*
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     * remove the ending spaces
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     */
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i = strlen(str);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    while ((i > 0) &&
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   ((str[i - 1] == '\n') || (str[i - 1] == '\r') ||
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    (str[i - 1] == ' ') || (str[i - 1] == '\t'))) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		i--;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		str[i] = 0;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handleURI(str);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	while (argv[arg] != NULL) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    handleURI(argv[arg]);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    arg++;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xmlMemoryDump();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return(0);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
125