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

📄 url.c

📁 基于minigui的浏览器. 这是最新版本.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  Transform (and resolve) an URL string into the respective DilloURL. *  If URL  =  "http://dillo.sf.net:8080/index.html?long#part2" *  then the resulting DilloURL should be: *  DilloURL = { *     url_string         = "http://dillo.sf.net:8080/index.html?long#part2" *     scheme             = "http" *     authority          = "dillo.sf.net:8080: *     path               = "/index.html" *     query              = "long" *     fragment           = "part2" *     hostname           = "dillo.sf.net" *     port               = 8080 *     flags              = 0 *     data               = NULL *     alt                = NULL *     ismap_url_len      = 0 *     scrolling_position = 0 *  } * *  Return NULL if URL is badly formed. */DilloUrl* a_Url_new(const gchar *url_str, const gchar *base_url,                    gint flags, gint32 posx, gint32 posy){   DilloUrl *url;   gchar *urlstring, *p, *new_str = NULL;   GString *SolvedUrl;   gint n_ic, n_ic_spc;   g_return_val_if_fail (url_str != NULL, NULL);   /* Count illegal characters (0x00-0x1F, 0x7F and space) */   urlstring = (gchar *)url_str;   n_ic = n_ic_spc = 0;   for (p = urlstring; *p; p++) {      n_ic_spc += (*p == ' ') ? 1 : 0;      n_ic += (*p != ' ' && *p > 0x1F && *p != 0x7F) ? 0 : 1;   }   if (n_ic) {      /* Strip illegal characters (they could also be encoded).       * There's no standard for illegal chars; we chose to strip. */      for (p = new_str = g_strdup(urlstring); *urlstring; urlstring++)         if (*urlstring > 0x1F && *urlstring != 0x7F && *urlstring != ' ')            *p++ = *urlstring;      *p = 0;      urlstring = new_str;   }   /* let's use a heuristic to set http: as default */   if (!base_url) {      base_url = "http:";      if (urlstring[0] != '/') {         p = strpbrk(urlstring, "/#?:");         if (!p || *p != ':')            urlstring = g_strconcat("//", urlstring, NULL);      } else if (urlstring[1] != '/')         urlstring = g_strconcat("/", urlstring, NULL);   }   /* Resolve the URL */   SolvedUrl = Url_resolve_relative(urlstring, NULL, base_url);   DEBUG_MSG(2, "SolvedUrl = %s\n", SolvedUrl->str);   g_return_val_if_fail (SolvedUrl != NULL, NULL);   /* Fill url data */   url = Url_object_new(SolvedUrl->str);   url->url_string = SolvedUrl;   url->flags = flags;   url->scrolling_position_x = posx;   url->scrolling_position_y = posy;   url->illegal_chars = n_ic;   url->illegal_chars_spc = n_ic_spc;   g_free(new_str);   return url;}/* *  Duplicate a Url structure */DilloUrl* a_Url_dup(const DilloUrl *ori){   DilloUrl *url;   url = Url_object_new(URL_STR_(ori));   g_return_val_if_fail (url != NULL, NULL);   url->url_string           = g_string_new(URL_STR(ori));   url->port                 = ori->port;   url->flags                = ori->flags;   url->data                 = g_strdup(ori->data);   url->alt                  = g_strdup(ori->alt);   url->ismap_url_len        = ori->ismap_url_len;   url->scrolling_position_x = ori->scrolling_position_x;   url->scrolling_position_y = ori->scrolling_position_y;   url->illegal_chars        = ori->illegal_chars;   url->illegal_chars_spc    = ori->illegal_chars_spc;   return url;}/* *  Compare two Url's to check if they are the same. *  The fields which are compared here are: *  <scheme>, <authority>, <path>, <query> and <data> *  Other fields are left for the caller to check * *  Return value: 0 if equal, 1 otherwise */gint a_Url_cmp(const DilloUrl *A, const DilloUrl *B){   if (!A || !B)      return 1;   if (A == B ||       (URL_STRCAMP_I_EQ(A->authority, B->authority) &&        URL_STRCAMP_EQ(A->path, B->path) &&        URL_STRCAMP_EQ(A->query, B->query) &&        URL_STRCAMP_EQ(A->data, B->data) &&        URL_STRCAMP_I_EQ(A->scheme, B->scheme)))      return 0;   return 1;}/* * Set DilloUrl flags */void a_Url_set_flags(DilloUrl *u, gint flags){   if (u)      u->flags = flags;}/* * Set DilloUrl data (like POST info, etc.) */void a_Url_set_data(DilloUrl *u, gchar *data){   if (u) {      g_free((gchar *)u->data);      u->data = g_strdup(data);   }}/* * Set DilloUrl alt (alternate text to the URL. Used by image maps) */void a_Url_set_alt(DilloUrl *u, const gchar *alt){   if (u) {      g_free((gchar *)u->alt);      u->alt = g_strdup(alt);   }}/* * Set DilloUrl scrolling position */void a_Url_set_pos(DilloUrl *u, gint32 posx, gint32 posy){   if (u) {      u->scrolling_position_x = posx;      u->scrolling_position_y = posy;   }}/* * Set DilloUrl ismap coordinates * (this is optimized for not hogging the CPU) */void a_Url_set_ismap_coords(DilloUrl *u, gchar *coord_str){   g_return_if_fail(u && coord_str);   if ( !u->ismap_url_len ) {      /* Save base-url length (without coords) */      u->ismap_url_len  = URL_STR_(u) ? u->url_string->len : 0;      a_Url_set_flags(u, URL_FLAGS(u) | URL_Ismap);   }   if (u->url_string) {      g_string_truncate(u->url_string, u->ismap_url_len);      g_string_append(u->url_string, coord_str);      u->query = u->url_string->str + u->ismap_url_len + 1;   }}/* * Given an hex octet (e.g., e3, 2F, 20), return the corresponding * character if the octet is valid, and -1 otherwise */static int Url_decode_hex_octet(const gchar *s){   gint hex_value;   gchar *tail, hex[3];   if (s && (hex[0] = s[0]) && (hex[1] = s[1])) {      hex[2] = 0;      hex_value = strtol(hex, &tail, 16);      if (tail - hex == 2)        return hex_value;   }   return -1;}/* * Parse possible hexadecimal octets in the URI path. * Returns a new allocated string. */gchar *a_Url_decode_hex_str(const gchar *str){   gchar *new_str, *dest;   int i, val;   if (!str)      return NULL;   /* most cases won't have hex octets */   if (!strchr(str, '%'))      return g_strdup(str);   dest = new_str = g_new(gchar, strlen(str) + 1);   for (i = 0; str[i]; i++) {      *dest++ = (str[i] == '%' && (val = Url_decode_hex_octet(str+i+1)) >= 0) ?                i+=2, val : str[i];   }   *dest++ = 0;   new_str = g_realloc(new_str, sizeof(gchar) * (dest - new_str));   return new_str;}/* * Urlencode 'str' * -RL :: According to the RFC 1738, only alphanumerics, the special *        characters "$-_.+!*'(),", and reserved characters ";/?:@=&" used *        for their *reserved purposes* may be used unencoded within a URL. * We'll escape everything but alphanumeric and "-_.*" (as lynx).  --Jcid * * Note: the content type "application/x-www-form-urlencoded" is used: *       i.e., ' ' -> '+' and '\n' -> CR LF (see HTML 4.01, Sec. 17.13.4) */gchar *a_Url_encode_hex_str(const gchar *str){   static const char *verbatim = "-_.*";   static const char *hex = "0123456789ABCDEF";   char *newstr, *c;   if (!str)      return NULL;   newstr = g_new(char, 6*strlen(str)+1);   for (c = newstr; *str; str++)      if ((isalnum(*str) && !(*str & 0x80)) || strchr(verbatim, *str))      /* we really need isalnum for the "C" locale */         *c++ = *str;      else if (*str == ' ')         *c++ = '+';      else if (*str == '\n') {         *c++ = '%';         *c++ = '0';         *c++ = 'D';         *c++ = '%';         *c++ = '0';         *c++ = 'A';      } else {         *c++ = '%';         *c++ = hex[(*str >> 4) & 15];         *c++ = hex[*str & 15];      }   *c = 0;  return newstr;}/* * RFC-2396 suggests this stripping when "importing" URLs from other media. * Strip: "URL:", enclosing < >, and embedded whitespace. * (We also strip illegal chars: 00-1F and 7F) */gchar *a_Url_string_strip_delimiters(const gchar *str){   gchar *p, *new_str, *text;   new_str = text = g_strdup(str);   if (new_str) {      if (strncmp(new_str, "URL:", 4) == 0)         text += 4;      if (*text == '<')         text++;      for (p = new_str; *text; text++)         if (*text > 0x1F && *text != 0x7F && *text != ' ')            *p++ = *text;      if (p > new_str && p[-1] == '>')         --p;      *p = 0;   }   return new_str;}

⌨️ 快捷键说明

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