static void insert_wd(unsigned char **up, unsigned char *cwd) { unsigned char *url = *up; if (!url || !cwd || !*cwd) return; if (casecmp(url, cast_uchar "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(cast_const_char(url + 7)) != _ABS_NO) return; #endif url = mem_alloc(strlen(cast_const_char *up) + strlen(cast_const_char cwd) + 2); memcpy(url, *up, 7); strcpy(cast_char(url + 7), cast_const_char cwd); if (!dir_sep(cwd[strlen(cast_const_char cwd) - 1])) strcat(cast_char url, "/"); strcat(cast_char url, cast_const_char(*up + 7)); mem_free(*up); *up = url; }
unsigned char *init_graphics(unsigned char *driver, unsigned char *param, unsigned char *display) { unsigned char *s = init_str(); int l = 0; struct graphics_driver **gd; #if defined(GRDRV_PMSHELL) && defined(GRDRV_X) if (is_xterm()) { static unsigned char swapped = 0; if (!swapped) { for (gd = graphics_drivers; *gd; gd++) { if (*gd == &pmshell_driver) *gd = &x_driver; else if (*gd == &x_driver) *gd = &pmshell_driver; } swapped = 1; } } #endif for (gd = graphics_drivers; *gd; gd++) { if (!driver || !*driver || !strcasecmp(cast_const_char (*gd)->name, cast_const_char driver)) { unsigned char *r; if ((!driver || !*driver) && (*gd)->flags & GD_NOAUTO) continue; if (!(r = init_graphics_driver(*gd, param, display))) { mem_free(s); return NULL; } if (!l) { if (!driver || !*driver) add_to_str(&s, &l, cast_uchar "Could not initialize any graphics driver. Tried the following drivers:\n"); else add_to_str(&s, &l, cast_uchar "Could not initialize graphics driver "); } add_to_str(&s, &l, (*gd)->name); add_to_str(&s, &l, cast_uchar ":\n"); add_to_str(&s, &l, r); mem_free(r); } } if (!l) { add_to_str(&s, &l, cast_uchar "Unknown graphics driver "); if (driver) add_to_str(&s, &l, driver); add_to_str(&s, &l, cast_uchar ".\nThe following graphics drivers are supported:\n"); add_graphics_drivers(&s, &l); add_to_str(&s, &l, cast_uchar "\n"); } return s; }
int parse_url(unsigned char *url, int *prlen, unsigned char **user, int *uslen, unsigned char **pass, int *palen, unsigned char **host, int *holen, unsigned char **port, int *polen, unsigned char **data, int *dalen, unsigned char **post) { unsigned char *p, *q; unsigned char p_c[2]; int a; if (prlen) *prlen = 0; if (user) *user = NULL; if (uslen) *uslen = 0; if (pass) *pass = NULL; if (palen) *palen = 0; if (host) *host = NULL; if (holen) *holen = 0; if (port) *port = NULL; if (polen) *polen = 0; if (data) *data = NULL; if (dalen) *dalen = 0; if (post) *post = NULL; if (!url || !(p = cast_uchar strchr(cast_const_char url, ':'))) return -1; if (prlen) *prlen = (int)(p - url); if ((a = check_protocol(url, (int)(p - url))) == -1) return -1; if (p[1] != '/' || p[2] != '/') { if (protocols[a].need_slashes) return -1; p -= 2; } if (protocols[a].free_syntax) { if (data) *data = p + 3; if (dalen) *dalen = (int)strlen(cast_const_char(p + 3)); return 0; } p += 3; q = p + strcspn(cast_const_char p, "@/?"); if (!*q && protocols[a].need_slash_after_host) return -1; if (*q == '@') { unsigned char *pp; while (strcspn(cast_const_char(q + 1), "@") < strcspn(cast_const_char(q + 1), "/?")) q = q + 1 + strcspn(cast_const_char(q + 1), "@"); pp = cast_uchar strchr(cast_const_char p, ':'); if (!pp || pp > q) { if (user) *user = p; if (uslen) *uslen = (int)(q - p); } else { if (user) *user = p; if (uslen) *uslen = (int)(pp - p); if (pass) *pass = pp + 1; if (palen) *palen = (int)(q - pp - 1); } p = q + 1; } if (p[0] == '[') { q = cast_uchar strchr(cast_const_char p, ']'); if (q) { q++; goto have_host; } } q = p + strcspn(cast_const_char p, ":/?"); have_host: if (!*q && protocols[a].need_slash_after_host) return -1; if (host) *host = p; if (holen) *holen = (int)(q - p); if (*q == ':') { unsigned char *pp = q + strcspn(cast_const_char q, "/"); int cc; if (*pp != '/' && protocols[a].need_slash_after_host) return -1; if (port) *port = q + 1; if (polen) *polen = (int)(pp - q - 1); for (cc = 0; cc < pp - q - 1; cc++) if (q[cc+1] < '0' || q[cc+1] > '9') return -1; q = pp; } if (*q && *q != '?') q++; p = q; p_c[0] = POST_CHAR; p_c[1] = 0; q = p + strcspn(cast_const_char p, cast_const_char p_c); if (data) *data = p; if (dalen) *dalen = (int)(q - p); if (post) *post = *q ? q + 1 : NULL; return 0; }