📄 url.c
字号:
return MAL_SUCCEED;#if 0 /* not reached */ if (i > 1000) s = (str)str_nil; else strcpy(b, "/robots.txt");#endif}/* COMMAND "getUser": Extract the user identity from the URL * SIGNATURE: getUser(str) : str; */strurl_getUser(str *retval, url t){ static char buf[1024]; char *b, *d = 0, *s; int i = 0; if (t == 0) throw(ILLARG, "url.getUser", "url missing"); s = (str)str_nil; while (*t && *t != ':') t++; t++; if (*t != '/') goto getUser_done; t++; if (*t != '/') goto getUser_done; t++; for (; *t && *t != '/'; t++) ; t++; if (*t == '~') { t++; b = buf; s = buf; for (; *t && *t != '/'; t++) { *b++ = *t; if (i++ == 1023) throw(PARSE, "url.getUser", "server name too long"); } *b = 0; }getUser_done: d = (char*) GDKmalloc(strlen(s) + 1); if (d) strcpy(d, s); *retval = d; return MAL_SUCCEED;}/* COMMAND "isaURL": Check conformity of the URL syntax * SIGNATURE: isaURL(str) : bit; */strurl_isaURL(bit *retval, /* put return atom here. */ url Str1 /* string: pointer to char. */ ){ (void) retval; if (Str1 == 0) throw(ILLARG, "url.isaURL", "url missing"); if (strlen(Str1) == 0) *retval = FALSE; else *retval = TRUE; return MAL_SUCCEED;}int needEscape(char c){ if( isalnum((int)c) ) return 0; if( c == '#' || c == '-' || c == '_' || c == '.' || c == '!' || c == '~' || c == '*' || c == '\'' || c == '(' || c == ')' ) return 0; return 1;}/* COMMAND "escape": this function applies the URI escaping rules defined in * section 2 of [RFC 3986] to the string supplied as 's'. * The effect of the function is to escape a set of identified characters in * the string. Each such character is replaced in the string by an escape * sequence, which is formed by encoding the character as a sequence of octets * in UTF-8, and then reprensenting each of these octets in the form %HH. * * All characters are escaped other than: * [a-z], [A-Z], [0-9], "#", "-", "_", ".", "!", "~", "*", "'", "(", ")" * * This function must always generate hexadecimal values using the upper-case * letters A-F. * * SIGNATURE: escape(str) : str; */strescape_str(str *retval, str s){ int x, y; str res; if (!s) throw(ILLARG, "url.escape", "url missing"); if (!( res = (str) GDKmalloc( strlen(s) * 3 ) )) throw(MAL, "url.escape", "malloc failed"); for (x = 0, y = 0; s[x]; ++x, ++y) { if (needEscape(s[x])){ if (s[x] == ' '){ res[y] = '+'; } else { sprintf(res+y, "%%%2x", s[x]); y += 2; } } else { res[y] = s[x]; } } res[y] = '\0'; *retval = GDKrealloc(res, strlen(res)+1); return MAL_SUCCEED;}/* COMMAND "unescape": Convert hexadecimal representations to ASCII characters. * All sequences of the form "% HEX HEX" are unescaped. * SIGNATURE: unescape(str) : str; */strunescape_str(str *retval, str s){ int x, y; str res; if (!s) throw(ILLARG, "url.escape", "url missing"); res = (str) GDKmalloc(strlen(s)); if (!res) throw(MAL, "url.unescape", "malloc failed"); for (x = 0, y = 0; s[x]; ++x, ++y) { if (s[x] == '%') { res[y] = x2c(&s[x + 1]); x += 2; } else { res[y] = s[x]; } } res[y] = '\0'; *retval = GDKrealloc(res, strlen(res)+1); return MAL_SUCCEED;}/* COMMAND "newurl": Construct a URL from protocol, host,and file * SIGNATURE: newurl(str, str, str) : str; */strurl_new3(str *retval, /* put string: pointer to char here. */ str Protocol, /* string: pointer to char. */ str Server, /* string: pointer to char. */ str File /* string: pointer to char. */ ){ char buf[1024]; str d, s = buf; if (strlen(File) + strlen(Server) + strlen(Protocol) > 1000) s = (str) str_nil; else sprintf(buf, "%s://%s/%s", Protocol, Server, File); d = (str) GDKmalloc(strlen(s) + 1); if (d) strcpy(d, s); *retval = d; return MAL_SUCCEED;}/* COMMAND "newurl": Construct a URL from protocol, host,port,and file * SIGNATURE: newurl(str, str, int, str) : str; */strurl_new4(str *retval, /* put string: pointer to char here. */ str Protocol, /* string: pointer to char. */ str Server, /* string: pointer to char. */ int *Port, /* pointer to integer. */ str File /* string: pointer to char. */ ){ char buf[1024]; str d, s = buf; if (strlen(File) + strlen(Server) + strlen(Protocol) > 1000) s = (str) str_nil; else sprintf(buf, "%s://%s:%d/%s", Protocol, Server, *Port, File); d = (str) GDKmalloc(strlen(s) + 1); if (d) strcpy(d, s); *retval = d; return MAL_SUCCEED;}#line 823 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/atoms/url.mx"#define LF 10#define CR 13voidgetword(char *word, char *line, char stop){ int x = 0, y; for (x = 0; ((line[x]) && (line[x] != stop)); x++) word[x] = line[x]; word[x] = '\0'; if (line[x]) ++x; y = 0; while ((line[y++] = line[x++]) != 0) ;}char *makeword(char *line, char stop){ int x = 0, y; char *word = (char *) malloc(sizeof(char) * (strlen(line) + 1)); for (x = 0; ((line[x]) && (line[x] != stop)); x++) word[x] = line[x]; word[x] = '\0'; if (line[x]) ++x; y = 0; while ((line[y++] = line[x++]) != 0) ; return word;}charx2c(char *what){ char digit; digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0')); digit *= 16; digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0')); return (digit);}voidplustospace(char *str){ int x; for (x = 0; str[x]; x++) if (str[x] == '+') str[x] = ' ';}#line 885 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/atoms/url.mx"#line 889 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/atoms/url.mx"intURLfromString(str src, int *len, str *url){ /* actually parse the message for valid url */ if (*url !=0) GDKfree(url); *len = strlen(src); *url = GDKstrdup(src); return *len;}intURLtoString(str *s, int *len, str src){ int l; if (GDK_STRNIL(src)) { **s = 0; return 0; } l = src == 0 ? 3 : strlen(src) + 3; /* if( !*s) *s= (str)GDKmalloc(*len = l); */ if (l >= *len) { GDKfree(*s); *s = (str) GDKmalloc(l); } snprintf(*s, l, "\"%s\"", src); *len = l - 1; return *len;}strURLgetAnchor(str *retval, str *val){ return url_getAnchor(retval, *val);}strURLgetBasename(str *retval, str *t){ return url_getBasename(retval, *t);}strURLgetContent(str *retval, str *Str1){ (void) Str1; /* fool compiler */ *retval = 0; throw(MAL, "url.getContent", "not yet implemented");}strURLgetContext(str *retval, str *val){ return url_getContext(retval, *val);}strURLgetDirectory(int *ret, str *tv){ (void) ret; (void) tv; throw(MAL, "url.getDirectory", "not yet available");/* this operation requres a BAT context, should be defined elsewhere url_getDirectory(ret, *tv);*/}strURLgetExtension(str *retval, str *tv){ return url_getExtension(retval, *tv);}strURLgetFile(str *retval, str *tv){ return url_getFile(retval, *tv);}#line 977 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/atoms/url.mx"strURLgetHost(str *retval, str *tv){ return url_getHost(retval, *tv);}#line 986 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/atoms/url.mx"strURLgetPort(str *retval, str *tv){ return url_getPort(retval, *tv);}strURLgetProtocol(str *retval, str *tv){ return url_getProtocol(retval, *tv);}strURLgetQuery(str *retval, str *tv){ return url_getQuery(retval, *tv);}strURLgetQueryArg(int *ret, str *tv){ (void) ret; (void) tv; throw(MAL, "url.getQueryArg", "Not yet implemented");/* url_getQueryArg(ret,*tv); return MAL_SUCCEED;*/}strURLgetRobotURL(str *retval, str *tv){ return url_getRobotURL(retval, *tv);}strURLgetUser(str *retval, str *tv){ return url_getUser(retval, *tv);}strURLisaURL(bit *retval, str *tv){ (void) retval; (void) tv; /* fool compiler */ if (tv == 0) throw(ILLARG, "url.isaURL", "no string"); throw(MAL, "url.isaURL", "not yet implemented");}strURLnew(str *url, str *val){ (void) url; /* fool compiler */ *url = GDKstrdup(*val); return MAL_SUCCEED;}strURLnew3(str *url, str *protocol, str *server, str *file){ int l, i; l = GDK_STRLEN(*file) + GDK_STRLEN(*server) + GDK_STRLEN(*protocol) + 10; *url = (str) GDKmalloc(l); snprintf(*url, l, "%s://", *protocol); i = strlen(*url); snprintf(*url +i, l - i, "%s", *server); i = strlen(*url); snprintf(*url +i, l - i, "/%s", *file); return MAL_SUCCEED;}strURLnew4(str *url, str *protocol, str *server, int *port, str *file){ str Protocol = *protocol; str Server = *server; str File = *file; int l, i; if (GDK_STRNIL(file)) File = ""; if (GDK_STRNIL(server)) Server = ""; if (GDK_STRNIL(protocol)) Protocol = ""; l = strlen(File) + strlen(Server) + strlen(Protocol) + 20; *url = (str) GDKmalloc(l); snprintf(*url, l, "%s://", Protocol); i = strlen(*url); snprintf(*url +i, l - i, "%s", Server); i = strlen(*url); snprintf(*url +i, l - i, ":%d", *port); i = strlen(*url); snprintf(*url +i, l - i, "/%s", File); return MAL_SUCCEED;}#line 1092 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/atoms/url.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -