1 /* 2 * testURI.c : a small tester program for XML input. 3 * 4 * See Copyright for the status of this software. 5 * 6 * daniel (at) veillard.com 7 */ 8 9 #include "libxml.h" 10 11 #include <string.h> 12 #include <stdio.h> 13 #include <stdarg.h> 14 15 #include <libxml/xmlmemory.h> 16 #include <libxml/uri.h> 17 #include <libxml/globals.h> 18 19 static const char *base = NULL; 20 static int escape = 0; 21 static int debug = 0; 22 static int relative = 0; 23 24 static void handleURI(const char *str) { 25 int ret; 26 xmlURIPtr uri; 27 xmlChar *res = NULL, *parsed = NULL; 28 29 uri = xmlCreateURI(); 30 31 if (base == NULL) { 32 ret = xmlParseURIReference(uri, str); 33 if (ret != 0) 34 printf("%s : error %d\n", str, ret); 35 else { 36 if (debug) { 37 if (uri->scheme) printf("scheme: %s\n", uri->scheme); 38 if (uri->opaque) printf("opaque: %s\n", uri->opaque); 39 if (uri->authority) printf("authority: %s\n", uri->authority); 40 if (uri->server) printf("server: %s\n", uri->server); 41 if (uri->user) printf("user: %s\n", uri->user); 42 if (uri->port != 0) printf("port: %d\n", uri->port); 43 if (uri->path) printf("path: %s\n", uri->path); 44 if (uri->query) printf("query: %s\n", uri->query); 45 if (uri->fragment) printf("fragment: %s\n", uri->fragment); 46 if (uri->query_raw) printf("query_raw: %s\n", uri->query_raw); 47 if (uri->cleanup != 0) printf("cleanup\n"); 48 } 49 xmlNormalizeURIPath(uri->path); 50 if (escape != 0) { 51 parsed = xmlSaveUri(uri); 52 res = xmlURIEscape(parsed); 53 printf("%s\n", (char *) res); 54 55 } else { 56 xmlPrintURI(stdout, uri); 57 printf("\n"); 58 } 59 } 60 } else { 61 if (relative) { 62 res = xmlBuildRelativeURI((xmlChar *)str, (xmlChar *) base); 63 } else { 64 res = xmlBuildURI((xmlChar *)str, (xmlChar *) base); 65 } 66 67 if (res != NULL) { 68 printf("%s\n", (char *) res); 69 } 70 else 71 printf("::ERROR::\n"); 72 } 73 if (res != NULL) 74 xmlFree(res); 75 if (parsed != NULL) 76 xmlFree(parsed); 77 xmlFreeURI(uri); 78 } 79 80 int main(int argc, char **argv) { 81 int i, arg = 1; 82 83 if ((argc > arg) && (argv[arg] != NULL) && 84 (!strcmp(argv[arg], "--relative"))) { 85 arg++; 86 relative++; 87 } 88 if ((argc > arg) && (argv[arg] != NULL) && 89 ((!strcmp(argv[arg], "-base")) || (!strcmp(argv[arg], "--base")))) { 90 arg++; 91 base = argv[arg]; 92 if (base != NULL) 93 arg++; 94 } 95 if ((argc > arg) && (argv[arg] != NULL) && 96 ((!strcmp(argv[arg], "-escape")) || (!strcmp(argv[arg], "--escape")))) { 97 arg++; 98 escape++; 99 } 100 if ((argc > arg) && (argv[arg] != NULL) && 101 ((!strcmp(argv[arg], "-debug")) || (!strcmp(argv[arg], "--debug")))) { 102 arg++; 103 debug++; 104 } 105 if (argv[arg] == NULL) { 106 char str[1024]; 107 108 while (1) { 109 /* 110 * read one line in string buffer. 111 */ 112 if (fgets (&str[0], sizeof (str) - 1, stdin) == NULL) 113 break; 114 115 /* 116 * remove the ending spaces 117 */ 118 i = strlen(str); 119 while ((i > 0) && 120 ((str[i - 1] == '\n') || (str[i - 1] == '\r') || 121 (str[i - 1] == ' ') || (str[i - 1] == '\t'))) { 122 i--; 123 str[i] = 0; 124 } 125 handleURI(str); 126 } 127 } else { 128 while (argv[arg] != NULL) { 129 handleURI(argv[arg]); 130 arg++; 131 } 132 } 133 xmlMemoryDump(); 134 return(0); 135 } 136