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

📄 url.c

📁 ELinks is an advanced and well-established feature-rich text mode web (HTTP/FTP/..) browser. ELinks
💻 C
📖 第 1 页 / 共 2 页
字号:
		/**d++ = s[0];*/		if (s == dd && !s[3]) goto p;		s += 2;		goto r;	}	if (dsep(s[0]) && s[1] == '.' && s[2] == '.' && (dsep(s[3]) || !s[3])) {		while (d > dd) {			d--;			if (dsep(*d)) goto b;		}		b:		if (!s[3]) *d++ = *s;		s += 3;		goto r;	}	p:	if ((*d++ = *s++)) goto r;}void insert_wd(unsigned char **up, unsigned char *cwd){	unsigned char *url = *up;	if (!url || !cwd || !*cwd) return;	if (casecmp(url, "file://", 7)) return;	if (dir_sep(url[7])) return;#ifdef DOS_FS	if (upcase(url[7]) >= 'A' && upcase(url[7]) <= 'Z' && url[8] == ':' && dir_sep(url[9])) return;#endif#ifdef SPAD	if (_is_absolute(url + 7) != _ABS_NO) return;#endif	url = mem_alloc(strlen(*up) + strlen(cwd) + 2);	memcpy(url, *up, 7);	strcpy(url + 7, cwd);	if (!dir_sep(cwd[strlen(cwd) - 1])) strcat(url, "/");	strcat(url, *up + 7);	mem_free(*up);	*up = url;}/* * U funkce join_urls musi byt prvni url absolutni (takove, co projde funkci * parse_url bez chyby --- pokud neni absolutni, tak to spatne na internal) a * druhe url je relativni cesta vuci nemu nebo taky absolutni url. Pokud je * druhe url absolutni, vrati se to; pokud je relativni, tak se spoji prvni a * druhe url. */unsigned char *join_urls(unsigned char *base, unsigned char *rel){	unsigned char *p, *n, *pp, *ch;	int l;	int lo = !casecmp(base, "file://", 7);	if (rel[0] == '#' || !rel[0]) {		n = stracpy(base);		for (p = n; *p && *p != POST_CHAR && *p != '#'; p++) ;		*p = 0;		add_to_strn(&n, rel);		extend_str(&n, 1);		translate_directories(n);		return n;	}	if (rel[0] == '?' || rel[0] == '&') {		unsigned char rj[3];		unsigned char *d = get_url_data(base);		if (!d) goto bad_base;		rj[0] = rel[0];		rj[1] = POST_CHAR;		rj[2] = 0;		d += strcspn(d, rj);		n = memacpy(base, d - base);		add_to_strn(&n, rel);		translate_directories(n);		return n;	}	if (rel[0] == '/' && rel[1] == '/') {		unsigned char *s, *n;		if (!(s = strstr(base, "//"))) {			if (!(s = strchr(base, ':'))) {				bad_base:				internal("bad base url: %s", base);				return NULL;			}			s++;		}		n = memacpy(base, s - base);		add_to_strn(&n, rel);		if (!parse_url(n, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) {			extend_str(&n, 1);			translate_directories(n);			return n;		}		mem_free(n);	}	if (!casecmp("proxy://", rel, 8)) goto prx;	if (!parse_url(rel, &l, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) {		n = stracpy(rel);		extend_str(&n, 1);		translate_directories(n);		return n;	}	n = stracpy(rel);	while (n[0] && n[strlen(n) - 1] <= ' ') n[strlen(n) - 1] = 0;	extend_str(&n, 1);	ch = strrchr(n, '#');	if (!ch || strchr(ch, '/')) ch = n + strlen(n);	memmove(ch + 1, ch, strlen(ch) + 1);	*ch = '/';	if (!parse_url(n, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) {		extend_str(&n, 1);		translate_directories(n);		return n;	}	mem_free(n);	prx:	if (parse_url(base, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &p, NULL, NULL) || !p) {		goto bad_base;	}	if (!dsep(*p)) p--;	if (end_of_dir(base, rel[0])) for (; *p; p++) {		if (end_of_dir(base, *p)) break;	} else if (!dsep(rel[0])) for (pp = p; *pp; pp++) {		if (end_of_dir(base, *pp)) break;		if (dsep(*pp)) p = pp + 1;	}	n = mem_alloc(p - base + strlen(rel) + 2);	memcpy(n, base, p - base);	strcpy(n + (p - base), rel);	translate_directories(n);	return n;}unsigned char *translate_url(unsigned char *url, unsigned char *cwd){	unsigned char *ch;	unsigned char *nu, *da;	unsigned char *prefix;	int sl;	while (*url == ' ') url++;	if (*url && url[strlen(url) - 1] == ' ') {		nu = stracpy(url);		while (*nu && nu[strlen(nu) - 1] == ' ') nu[strlen(nu) - 1] = 0;		ch = translate_url(nu, cwd);		mem_free(nu);		return ch;	}	if (!casecmp("proxy://", url, 8)) return NULL;	if (!parse_url(url, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &da, NULL, NULL)) {		nu = stracpy(url);		insert_wd(&nu, cwd);		extend_str(&nu, 1);		translate_directories(nu);		return nu;	}	if (strchr(url, POST_CHAR)) return NULL;	if (strstr(url, "://")) {		nu = stracpy(url);		extend_str(&nu, 1);		ch = strrchr(nu, '#');		if (!ch || strchr(ch, '/')) ch = nu + strlen(nu);		memmove(ch + 1, ch, strlen(ch) + 1);		*ch = '/';		if (!parse_url(nu, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) {			insert_wd(&nu, cwd);			extend_str(&nu, 1);			translate_directories(nu);			return nu;		}		mem_free(nu);	}	ch = url + strcspn(url, ".:/@");	prefix = "file://";	sl = 0;#ifdef SPAD	if (strchr(url, ':') && _is_local(url)) goto set_prefix;#endif	if (*ch != ':' || *(url + strcspn(url, "/@")) == '@') {		if (*url != '.' && *ch == '.') {			unsigned char *f, *e;			int i;			for (e = ch + 1; *(f = e + strcspn(e, ".:/")) == '.'; e = f + 1) ;			for (i = 0; i < f - e; i++) if (e[i] < '0' || e[i] > '9') goto noip;			goto http;			noip:			if (f - e == 2 && casecmp(e, "gz", 2)) {				http:				prefix = "http://", sl = 1;			} else {				unsigned char *tld[] = { "com", "edu", "net", "org", "gov", "mil", "int", "arpa", "aero", "biz", "coop", "info", "museum", "name", "pro", "cat", "jobs", "mobi", "travel", "tel", NULL };				for (i = 0; tld[i]; i++) if ((size_t)(f - e) == strlen(tld[i]) && !casecmp(tld[i], e, f - e)) goto http;			}		}		if (*ch == '@' || *ch == ':' || !cmpbeg(url, "ftp.")) prefix = "ftp://", sl = 1;		goto set_prefix;		set_prefix:		nu = stracpy(prefix);		add_to_strn(&nu, url);		if (sl && !strchr(url, '/')) add_to_strn(&nu, "/");		if (parse_url(nu, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) mem_free(nu), nu = NULL;		else {			insert_wd(&nu, cwd);			extend_str(&nu, 1);			translate_directories(nu);		}		return nu;	}	sl = 1;#ifdef DOS_FS	if (ch == url + 1) goto set_prefix;#endif	if (!(nu = memacpy(url, ch - url + 1))) return NULL;	add_to_strn(&nu, "//");	add_to_strn(&nu, ch + 1);	if (!parse_url(nu, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) {		insert_wd(&nu, cwd);		extend_str(&nu, 1);		translate_directories(nu);		return nu;	}	add_to_strn(&nu, "/");	if (!parse_url(nu, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) {		insert_wd(&nu, cwd);		extend_str(&nu, 1);		translate_directories(nu);		return nu;	}	mem_free(nu);	return NULL;}unsigned char *extract_position(unsigned char *url){	unsigned char *u, *uu, *r;	if ((u = get_url_data(url))) url = u;	if (!(u = strchr(url, POST_CHAR))) u = url + strlen(url);	if (!(uu = memchr(url, '#', u - url))) return NULL;	r = mem_alloc(u - uu);	memcpy(r, uu + 1, u - uu - 1);	r[u - uu - 1] = 0;	memmove(uu, u, strlen(u) + 1);	return r;}#define accept_char(x)	((x) != '"' && (x) != '\'' && (x) != '&' && (x) != '<' && (x) != '>')#define special_char(x)	((x) == '%' || (x) == '#')void add_conv_str(unsigned char **s, int *l, unsigned char *b, int ll, int encode_special){	for (; ll; ll--, b++) {		if ((unsigned char)*b < ' ') continue;		if (special_char(*b) && encode_special == 1) {			unsigned char h[4];			sprintf(h, "%%%02X", (unsigned)*b & 0xff);			add_to_str(s, l, h);		} else if (*b == '%' && encode_special <= -1 && ll > 2 && ((b[1] >= '0' && b[1] <= '9') || (b[1] >= 'A' && b[1] <= 'F') || (b[1] >= 'a' && b[1] <= 'f'))) {			unsigned char h = 0;			int i;			for (i = 1; i < 3; i++) {				if (b[i] >= '0' && b[i] <= '9') h = h * 16 + b[i] - '0';				if (b[i] >= 'A' && b[i] <= 'F') h = h * 16 + b[i] - 'A' + 10;				if (b[i] >= 'a' && b[i] <= 'f') h = h * 16 + b[i] - 'a' + 10;			}			if (h >= ' ') add_chr_to_str(s, l, h);			ll -= 2;			b += 2;		} else if (accept_char(*b) || encode_special == -2) {			add_chr_to_str(s, l, *b);		} else {			add_to_str(s, l, "&#");			add_num_to_str(s, l, (int)*b);			add_chr_to_str(s, l, ';');		}	}}

⌨️ 快捷键说明

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