⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uri.c

📁 Vovida 社区开源的 SIP 协议源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/** * uri.c: set of generic URI related routines  * * Reference: RFC 2396 * * See Copyright for the status of this software. * * Daniel.Veillard@w3.org */#include "global.h"#ifdef WIN32#define INCLUDE_WINSOCK#include "win32config.h"#else#include "config.h"#endif#include <stdio.h>#include <string.h>#include <libxml/xmlmemory.h>#include <libxml/uri.h>/** * alpha    = lowalpha | upalpha */#define IS_ALPHA(x) (IS_LOWALPHA(x) || IS_UPALPHA(x))/** * lowalpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | *            "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | *            "u" | "v" | "w" | "x" | "y" | "z" */#define IS_LOWALPHA(x) (((x) >= 'a') && ((x) <= 'z'))/** * upalpha = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | *           "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | *           "U" | "V" | "W" | "X" | "Y" | "Z" */#define IS_UPALPHA(x) (((x) >= 'A') && ((x) <= 'Z'))/** * digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" */#define IS_DIGIT(x) (((x) >= '0') && ((x) <= '9'))/** * alphanum = alpha | digit */#define IS_ALPHANUM(x) (IS_ALPHA(x) || IS_DIGIT(x))/** * he(x) = digit | "A" | "B" | "C" | "D" | "E" | "F" | *               "a" | "b" | "c" | "d" | "e" | "f" */#define IS_HEX(x) ((IS_DIGIT(x)) || (((x) >= 'a') && ((x) <= 'f')) || \	    (((x) >= 'A') && ((x) <= 'F')))/** * mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" */#define IS_MARK(x) (((x) == '-') || ((x) == '_') || ((x) == '.') ||	\    ((x) == '!') || ((x) == '~') || ((x) == '*') || ((x) == '\'') ||	\    ((x) == '(') || ((x) == ')'))/** * reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," */#define IS_RESERVED(x) (((x) == ';') || ((x) == '/') || ((x) == '?') ||	\        ((x) == ':') || ((x) == '@') || ((x) == '&') || ((x) == '=') ||	\	((x) == '+') || ((x) == '$') || ((x) == ','))/** * unreserved = alphanum | mark */#define IS_UNRESERVED(x) (IS_ALPHANUM(x) || IS_MARK(x))/** * escaped = "%" hex hex */#define IS_ESCAPED(p) ((*(p) == '%') && (IS_HEX((p)[1])) &&		\	    (IS_HEX((p)[2])))/** * uric_no_slash = unreserved | escaped | ";" | "?" | ":" | "@" | *                        "&" | "=" | "+" | "$" | "," */#define IS_URIC_NO_SLASH(p) ((IS_UNRESERVED(*(p))) || (IS_ESCAPED(p)) ||\	        ((*(p) == ';')) || ((*(p) == '?')) || ((*(p) == ':')) ||\	        ((*(p) == '@')) || ((*(p) == '&')) || ((*(p) == '=')) ||\	        ((*(p) == '+')) || ((*(p) == '$')) || ((*(p) == ',')))/** * pchar = unreserved | escaped | ":" | "@" | "&" | "=" | "+" | "$" | "," */#define IS_PCHAR(p) ((IS_UNRESERVED(*(p))) || (IS_ESCAPED(p)) ||	\	        ((*(p) == ':')) || ((*(p) == '@')) || ((*(p) == '&')) ||\	        ((*(p) == '=')) || ((*(p) == '+')) || ((*(p) == '$')) ||\	        ((*(p) == ',')))/** * rel_segment   = 1*( unreserved | escaped | *                 ";" | "@" | "&" | "=" | "+" | "$" | "," ) */#define IS_SEGMENT(p) ((IS_UNRESERVED(*(p))) || (IS_ESCAPED(p)) ||	\          ((*(p) == ';')) || ((*(p) == '@')) || ((*(p) == '&')) ||	\	  ((*(p) == '=')) || ((*(p) == '+')) || ((*(p) == '$')) ||	\	  ((*(p) == ',')))/** * scheme = alpha *( alpha | digit | "+" | "-" | "." ) */#define IS_SCHEME(x) ((IS_ALPHA(x)) || (IS_DIGIT(x)) ||			\	              ((x) == '+') || ((x) == '-') || ((x) == '.'))/** * reg_name = 1*( unreserved | escaped | "$" | "," | *                ";" | ":" | "@" | "&" | "=" | "+" ) */#define IS_REG_NAME(p) ((IS_UNRESERVED(*(p))) || (IS_ESCAPED(p)) ||	\       ((*(p) == '$')) || ((*(p) == ',')) || ((*(p) == ';')) ||		\       ((*(p) == ':')) || ((*(p) == '@')) || ((*(p) == '&')) ||		\       ((*(p) == '=')) || ((*(p) == '+')))/** * userinfo = *( unreserved | escaped | ";" | ":" | "&" | "=" | *                      "+" | "$" | "," ) */#define IS_USERINFO(p) ((IS_UNRESERVED(*(p))) || (IS_ESCAPED(p)) ||	\       ((*(p) == ';')) || ((*(p) == ':')) || ((*(p) == '&')) ||		\       ((*(p) == '=')) || ((*(p) == '+')) || ((*(p) == '$')) ||		\       ((*(p) == ',')))/** * uric = reserved | unreserved | escaped */#define IS_URIC(p) ((IS_UNRESERVED(*(p))) || (IS_ESCAPED(p)) ||		\	            (IS_RESERVED(*(p))))/** * Skip to next pointer char, handle escaped sequences */#define NEXT(p) ((*p == '%')? p += 3 : p++)/** * Productions from the spec. * *    authority     = server | reg_name *    reg_name      = 1*( unreserved | escaped | "$" | "," | *                        ";" | ":" | "@" | "&" | "=" | "+" ) * * path          = [ abs_path | opaque_part ] *//** * xmlCreateURI: * * Simply creates an empty xmlURI * * Returns the new structure or NULL in case of error */xmlURIPtrxmlCreateURI(void) {    xmlURIPtr ret;    ret = (xmlURIPtr) xmlMalloc(sizeof(xmlURI));    if (ret == NULL) {	fprintf(stderr, "xmlCreateURI: out of memory\n");	return(NULL);    }    memset(ret, 0, sizeof(xmlURI));    return(ret);}/** * xmlSaveUri: * @uri:  pointer to an xmlURI * * Save the URI as an escaped string * * Returns a new string (to be deallocated by caller) */xmlChar *xmlSaveUri(xmlURIPtr uri) {    xmlChar *ret = NULL;    const char *p;    int len;    int max;    if (uri == NULL) return(NULL);    max = 80;    ret = xmlMalloc((max + 1) * sizeof(xmlChar));    if (ret == NULL) {	fprintf(stderr, "xmlSaveUri: out of memory\n");	return(NULL);    }    len = 0;    if (uri->scheme != NULL) {	p = uri->scheme;	while (*p != 0) {	    if (len >= max) {		max *= 2;		ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));		if (ret == NULL) {		    fprintf(stderr, "xmlSaveUri: out of memory\n");		    return(NULL);		}	    }	    ret[len++] = *p++;	}	if (len >= max) {	    max *= 2;	    ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));	    if (ret == NULL) {		fprintf(stderr, "xmlSaveUri: out of memory\n");		return(NULL);	    }	}	ret[len++] = ':';    }    if (uri->opaque != NULL) {	p = uri->opaque;	while (*p != 0) {	    if (len + 3 >= max) {		max *= 2;		ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));		if (ret == NULL) {		    fprintf(stderr, "xmlSaveUri: out of memory\n");		    return(NULL);		}	    }	    if ((IS_UNRESERVED(*(p))) ||	        ((*(p) == ';')) || ((*(p) == '?')) || ((*(p) == ':')) ||	        ((*(p) == '@')) || ((*(p) == '&')) || ((*(p) == '=')) ||	        ((*(p) == '+')) || ((*(p) == '$')) || ((*(p) == ',')))		ret[len++] = *p++;	    else {		int val = *p++;		ret[len++] = '%';		switch (val / 0x10) {		    case 0xF: ret[len++] = 'F'; break;		    case 0xE: ret[len++] = 'E'; break;		    case 0xD: ret[len++] = 'D'; break;		    case 0xC: ret[len++] = 'C'; break;		    case 0xB: ret[len++] = 'B'; break;		    case 0xA: ret[len++] = 'A'; break;		    default: ret[len++] = '0' + (val / 0x10);		}		switch (val % 0x10) {		    case 0xF: ret[len++] = 'F'; break;		    case 0xE: ret[len++] = 'E'; break;		    case 0xD: ret[len++] = 'D'; break;		    case 0xC: ret[len++] = 'C'; break;		    case 0xB: ret[len++] = 'B'; break;		    case 0xA: ret[len++] = 'A'; break;		    default: ret[len++] = '0' + (val % 0x10);		}	    }	}	if (len >= max) {	    max *= 2;	    ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));	    if (ret == NULL) {		fprintf(stderr, "xmlSaveUri: out of memory\n");		return(NULL);	    }	}	ret[len++] = 0;    } else {	if (uri->server != NULL) {	    if (len + 3 >= max) {		max *= 2;		ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));		if (ret == NULL) {		    fprintf(stderr, "xmlSaveUri: out of memory\n");		    return(NULL);		}	    }	    ret[len++] = '/';	    ret[len++] = '/';	    if (uri->user != NULL) {		p = uri->user;		while (*p != 0) {		    if (len + 3 >= max) {			max *= 2;			ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));			if (ret == NULL) {			    fprintf(stderr, "xmlSaveUri: out of memory\n");			    return(NULL);			}		    }		    if ((IS_UNRESERVED(*(p))) ||			((*(p) == ';')) || ((*(p) == ':')) || ((*(p) == '&')) ||			((*(p) == '=')) || ((*(p) == '+')) || ((*(p) == '$')) ||			((*(p) == ',')))			ret[len++] = *p++;		    else {			int val = *p++;			ret[len++] = '%';			switch (val / 0x10) {			    case 0xF: ret[len++] = 'F'; break;			    case 0xE: ret[len++] = 'E'; break;			    case 0xD: ret[len++] = 'D'; break;			    case 0xC: ret[len++] = 'C'; break;			    case 0xB: ret[len++] = 'B'; break;			    case 0xA: ret[len++] = 'A'; break;			    default: ret[len++] = '0' + (val / 0x10);			}			switch (val % 0x10) {			    case 0xF: ret[len++] = 'F'; break;			    case 0xE: ret[len++] = 'E'; break;			    case 0xD: ret[len++] = 'D'; break;			    case 0xC: ret[len++] = 'C'; break;			    case 0xB: ret[len++] = 'B'; break;			    case 0xA: ret[len++] = 'A'; break;			    default: ret[len++] = '0' + (val % 0x10);			}		    }		}		if (len + 3 >= max) {		    max *= 2;		    ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));		    if (ret == NULL) {			fprintf(stderr, "xmlSaveUri: out of memory\n");			return(NULL);		    }		}		ret[len++] = '@';	    }	    p = uri->server;	    while (*p != 0) {		if (len >= max) {		    max *= 2;		    ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));		    if (ret == NULL) {			fprintf(stderr, "xmlSaveUri: out of memory\n");			return(NULL);		    }		}		ret[len++] = *p++;	    }	    if (uri->port > 0) {		if (len + 10 >= max) {		    max *= 2;		    ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));		    if (ret == NULL) {			fprintf(stderr, "xmlSaveUri: out of memory\n");			return(NULL);		    }		}		len += sprintf((char *) &ret[len], ":%d", uri->port);	    }	} else if (uri->authority != NULL) {	    if (len + 3 >= max) {		max *= 2;		ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));		if (ret == NULL) {		    fprintf(stderr, "xmlSaveUri: out of memory\n");		    return(NULL);		}	    }	    ret[len++] = '/';	    ret[len++] = '/';	    p = uri->authority;	    while (*p != 0) {		if (len + 3 >= max) {		    max *= 2;		    ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));		    if (ret == NULL) {			fprintf(stderr, "xmlSaveUri: out of memory\n");			return(NULL);		    }		}		if ((IS_UNRESERVED(*(p))) ||                    ((*(p) == '$')) || ((*(p) == ',')) || ((*(p) == ';')) ||                    ((*(p) == ':')) || ((*(p) == '@')) || ((*(p) == '&')) ||                    ((*(p) == '=')) || ((*(p) == '+')))		    ret[len++] = *p++;		else {		    int val = *p++;		    ret[len++] = '%';		    switch (val / 0x10) {			case 0xF: ret[len++] = 'F'; break;			case 0xE: ret[len++] = 'E'; break;			case 0xD: ret[len++] = 'D'; break;			case 0xC: ret[len++] = 'C'; break;			case 0xB: ret[len++] = 'B'; break;			case 0xA: ret[len++] = 'A'; break;			default: ret[len++] = '0' + (val / 0x10);		    }		    switch (val % 0x10) {			case 0xF: ret[len++] = 'F'; break;			case 0xE: ret[len++] = 'E'; break;			case 0xD: ret[len++] = 'D'; break;			case 0xC: ret[len++] = 'C'; break;			case 0xB: ret[len++] = 'B'; break;			case 0xA: ret[len++] = 'A'; break;			default: ret[len++] = '0' + (val % 0x10);		    }		}	    }	}	if (uri->path != NULL) {	    p = uri->path;	    while (*p != 0) {		if (len + 3 >= max) {		    max *= 2;		    ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));		    if (ret == NULL) {			fprintf(stderr, "xmlSaveUri: out of memory\n");			return(NULL);		    }		}		if ((IS_UNRESERVED(*(p))) || ((*(p) == '/')) ||                    ((*(p) == ';')) || ((*(p) == '@')) || ((*(p) == '&')) ||	            ((*(p) == '=')) || ((*(p) == '+')) || ((*(p) == '$')) ||	            ((*(p) == ',')))		    ret[len++] = *p++;		else {		    int val = *p++;		    ret[len++] = '%';		    switch (val / 0x10) {			case 0xF: ret[len++] = 'F'; break;			case 0xE: ret[len++] = 'E'; break;			case 0xD: ret[len++] = 'D'; break;			case 0xC: ret[len++] = 'C'; break;			case 0xB: ret[len++] = 'B'; break;			case 0xA: ret[len++] = 'A'; break;			default: ret[len++] = '0' + (val / 0x10);		    }		    switch (val % 0x10) {			case 0xF: ret[len++] = 'F'; break;			case 0xE: ret[len++] = 'E'; break;			case 0xD: ret[len++] = 'D'; break;			case 0xC: ret[len++] = 'C'; break;			case 0xB: ret[len++] = 'B'; break;			case 0xA: ret[len++] = 'A'; break;			default: ret[len++] = '0' + (val % 0x10);		    }		}	    }	}	if (uri->query != NULL) {	    if (len + 3 >= max) {		max *= 2;		ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));		if (ret == NULL) {		    fprintf(stderr, "xmlSaveUri: out of memory\n");		    return(NULL);		}	    }	    ret[len++] = '?';	    p = uri->query;	    while (*p != 0) {		if (len + 3 >= max) {		    max *= 2;		    ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));		    if (ret == NULL) {			fprintf(stderr, "xmlSaveUri: out of memory\n");			return(NULL);		    }		}		if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) 		    ret[len++] = *p++;		else {		    int val = *p++;		    ret[len++] = '%';		    switch (val / 0x10) {			case 0xF: ret[len++] = 'F'; break;			case 0xE: ret[len++] = 'E'; break;			case 0xD: ret[len++] = 'D'; break;			case 0xC: ret[len++] = 'C'; break;			case 0xB: ret[len++] = 'B'; break;			case 0xA: ret[len++] = 'A'; break;			default: ret[len++] = '0' + (val / 0x10);		    }		    switch (val % 0x10) {			case 0xF: ret[len++] = 'F'; break;			case 0xE: ret[len++] = 'E'; break;			case 0xD: ret[len++] = 'D'; break;			case 0xC: ret[len++] = 'C'; break;			case 0xB: ret[len++] = 'B'; break;			case 0xA: ret[len++] = 'A'; break;			default: ret[len++] = '0' + (val % 0x10);		    }		}	    }	}	if (uri->fragment != NULL) {	    if (len + 3 >= max) {		max *= 2;		ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));		if (ret == NULL) {		    fprintf(stderr, "xmlSaveUri: out of memory\n");		    return(NULL);		}	    }	    ret[len++] = '#';	    p = uri->fragment;	    while (*p != 0) {		if (len + 3 >= max) {		    max *= 2;		    ret = xmlRealloc(ret, (max + 1) * sizeof(xmlChar));		    if (ret == NULL) {			fprintf(stderr, "xmlSaveUri: out of memory\n");			return(NULL);		    }		}		if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) 		    ret[len++] = *p++;		else {		    int val = *p++;		    ret[len++] = '%';		    switch (val / 0x10) {			case 0xF: ret[len++] = 'F'; break;			case 0xE: ret[len++] = 'E'; break;			case 0xD: ret[len++] = 'D'; break;			case 0xC: ret[len++] = 'C'; break;			case 0xB: ret[len++] = 'B'; break;			case 0xA: ret[len++] = 'A'; break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -