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

📄 url.c

📁 嵌入式下基于MiniGUI的Web Browser
💻 C
📖 第 1 页 / 共 2 页
字号:
 *     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, *s;   GString *SolvedUrl;   gint n_ic;   g_return_val_if_fail (url_str != NULL, NULL);   /* denounce illegal characters (0x00-0x1F, 0x7F and space) */   urlstring = (gchar *)url_str;   for (p = s = urlstring; *s; s++)      if (*s > 0x1F && *s != 0x7F && *s != ' ')         p++;   /* number of illegal characters */   n_ic = s - p;   /* 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;   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;   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 char *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(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;}gboolean a_Url_does_visited (DilloUrl *u){    return TRUE;}/* * Given an hex octet (e3, 2F, 20), return the corresponding * character if the octet is valid, and -1 otherwise */static int Url_parse_hex_octet(const gchar *s){   gint hex_value;   gchar *tail, hex[3];   if ( (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 new allocated string. */gchar *a_Url_parse_hex_path(const DilloUrl *u){   const gchar *src;   gchar *new_uri, *dest;   int i, val;   if (!u || !u->path || !u->path[0])      return NULL;   /* most cases won't have hex octets */   if (!strchr(u->path, '%'))      return g_strdup(u->path);   src = u->path;   dest = new_uri = g_new(gchar, strlen(src) + 1);   for (i = 0; src[i]; i++) {      *dest++ = (src[i] == '%' && (val = Url_parse_hex_octet(src+i+1)) >= 0) ?                val + !(i+=2) : src[i];   }   *dest++ = 0;   new_uri = g_realloc(new_uri, sizeof(gchar) * (dest - new_uri));   return new_uri;}

⌨️ 快捷键说明

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