예제 #1
0
파일: base64.c 프로젝트: BizioMetal/swfmill
long base64_decode (char *to, char *from, unsigned int len)
{
	char *fromp = from;
	char *top = to;
	char *p;
	unsigned char cbyte;
	unsigned char obyte;
	int padding = 0;

	for (; len >= 4; len -= 4) {
		if ((cbyte = *fromp++) == '=') cbyte = 0;
		else {
			if (badchar(cbyte, p)) return -1;
			cbyte = (p - b64string);
		}
		obyte = cbyte << 2;		/* 1111 1100 */

		if ((cbyte = *fromp++) == '=') cbyte = 0;
		else {
			if (badchar(cbyte, p)) return -1;
			cbyte = p - b64string;
		}
		obyte |= cbyte >> 4;		/* 0000 0011 */
		*top++ = obyte;

		obyte = cbyte << 4;		/* 1111 0000 */
		if ((cbyte = *fromp++) == '=') { cbyte = 0; padding++; }
		else {
			padding = 0;
			if (badchar (cbyte, p)) return -1;
			cbyte = p - b64string;
		}
		obyte |= cbyte >> 2;		/* 0000 1111 */
		*top++ = obyte;

		obyte = cbyte << 6;		/* 1100 0000 */
		if ((cbyte = *fromp++) == '=') { cbyte = 0; padding++; }
		else {
			padding = 0;
			if (badchar (cbyte, p)) return -1;
			cbyte = p - b64string;
		}
		obyte |= cbyte;			/* 0011 1111 */
		*top++ = obyte;
	}

	*top = 0;
	if (len) return -1;
	return (top - to) - padding;
}
예제 #2
0
/* Generic sysfs class lookup */
static int
affinity_class(struct bitmask *mask, char *cls, const char *dev)
{
	int ret;
	while (isspace(*dev))
		dev++;
	if (badchar(dev)) {
		numa_warn(W_badchar, "Illegal characters in `%s' specification",
			  dev);
		return -1;
	}

	/* Somewhat hackish: extract device from symlink path.
	   Better would be a direct backlink. This knows slightly too
	   much about the actual sysfs layout. */
	char path[1024];
	char *fn = NULL;
	if (asprintf(&fn, "/sys/class/%s/%s", cls, dev) > 0 &&
	    readlink(fn, path, sizeof path) > 0) {
		regex_t re;
		regmatch_t match[2];
		char *p;

		regcomp(&re, "(/devices/pci[0-9a-fA-F:/]+\\.[0-9]+)/",
			REG_EXTENDED);
		ret = regexec(&re, path, 2, match, 0);
		regfree(&re);
		if (ret == 0) {
			free(fn);
			assert(match[0].rm_so > 0);
			assert(match[0].rm_eo > 0);
			path[match[1].rm_eo + 1] = 0;
			p = path + match[0].rm_so;
			ret = sysfs_node_read(mask, "/sys/%s/numa_node", p);
			if (ret < 0)
				return node_parse_failure(ret, NULL, p);
			return ret;
		}
	}
	free(fn);

	ret = sysfs_node_read(mask, "/sys/class/%s/%s/device/numa_node",
			      cls, dev);
	if (ret < 0)
		return node_parse_failure(ret, cls, dev);
	return 0;
}
예제 #3
0
static GList *extract_urls(const char *text)
{
	const char *t, *c, *q = NULL;
	char *url_buf;
	GList *ret = NULL;
	gboolean inside_html = FALSE;
	int inside_paren = 0;
	c = text;
	while (*c) {
		if (*c == '(' && !inside_html) {
			inside_paren++;
			c++;
		}
		if (inside_html) {
			if (*c == '>') {
				inside_html = FALSE;
			} else if (!q && (*c == '\"' || *c == '\'')) {
				q = c;
			} else if(q) {
				if(*c == *q)
					q = NULL;
			}
		} else if (*c == '<') {
			inside_html = TRUE;
			if (!g_ascii_strncasecmp(c, "<A", 2)) {
				while (1) {
					if (*c == '>') {
						inside_html = FALSE;
						break;
					}
					c++;
					if (!(*c))
						break;
				}
			}
		} else if ((*c=='h') && (!g_ascii_strncasecmp(c, "http://", 7) ||
					(!g_ascii_strncasecmp(c, "https://", 8)))) {
			t = c;
			while (1) {
				if (badchar(*t) || badentity(t)) {

					if ((!g_ascii_strncasecmp(c, "http://", 7) && (t - c == 7)) ||
						(!g_ascii_strncasecmp(c, "https://", 8) && (t - c == 8))) {
						break;
					}

					if (*(t) == ',' && (*(t + 1) != ' ')) {
						t++;
						continue;
					}

					if (*(t - 1) == '.')
						t--;
					if ((*(t - 1) == ')' && (inside_paren > 0))) {
						t--;
					}

					url_buf = g_strndup(c, t - c);
					if (!g_list_find_custom(ret, url_buf, (GCompareFunc)strcmp)) {
						purple_debug_info("TinyURL", "Added URL %s\n", url_buf);
						ret = g_list_append(ret, url_buf);
					} else {
						g_free(url_buf);
					}
					c = t;
					break;
				}
				t++;

			}
		} else if (!g_ascii_strncasecmp(c, "www.", 4) && (c == text || badchar(c[-1]) || badentity(c-1))) {
			if (c[4] != '.') {
				t = c;
				while (1) {
					if (badchar(*t) || badentity(t)) {
						if (t - c == 4) {
							break;
						}

						if (*(t) == ',' && (*(t + 1) != ' ')) {
							t++;
							continue;
						}

						if (*(t - 1) == '.')
							t--;
						if ((*(t - 1) == ')' && (inside_paren > 0))) {
							t--;
						}
						url_buf = g_strndup(c, t - c);
						if (!g_list_find_custom(ret, url_buf, (GCompareFunc)strcmp)) {
							purple_debug_info("TinyURL", "Added URL %s\n", url_buf);
							ret = g_list_append(ret, url_buf);
						} else {
							g_free(url_buf);
						}
						c = t;
						break;
					}
					t++;
				}
			}
		}
		if (*c == ')' && !inside_html) {
			inside_paren--;
			c++;
		}
		if (*c == 0)
			break;
		c++;
	}
	return ret;
}
예제 #4
0
static char *unlinkify_text(const char *text)
{
  const char *c, *t, *q = NULL;
  const char *URL;
  const int BUF_LEN = 1024;
  char *tmp;
  char url_buf[BUF_LEN * 4];

  URL=_("U R L");

  GString *ret = g_string_new("");

  /* Assumes you have a buffer able to cary at least BUF_LEN * 2 bytes */
  
  c = text;
  while (*c) {
    if(!q && (*c == '\"' || *c == '\'')) {
      q = c;
    } else if(q) {
      if(*c == *q)
	q = NULL;
    } else if (!g_ascii_strncasecmp(c, "<A", 2)) {
      while (1) {
	if (!g_ascii_strncasecmp(c, "/A>", 3)) {
	  break;
	}
	ret = g_string_append_c(ret, *c);
	c++;
	if (!(*c))
	  break;
      }
    } else if ((*c=='h') && (!g_ascii_strncasecmp(c, "http://", 7) ||
			     (!g_ascii_strncasecmp(c, "https://", 8)))) {
      t = c;
      while (1) {
	if (badchar(*t)) {
	  
	  if (*(t) == ',' && (*(t + 1) != ' ')) {
	    t++;
	    continue;
	  }
	  
	  if (*(t - 1) == '.')
	    t--;
	  g_string_append(ret, URL);
	  c = t;
	  break;
	}
	if (!t)
	  break;
	t++;
	
      }
    } else if (!g_ascii_strncasecmp(c, "www.", 4)) {
      if (c[4] != '.') {
	t = c;
	while (1) {
	  if (badchar(*t)) {
	    if (t - c == 4) {
	      break;
	    }
	    
	    if (*(t) == ',' && (*(t + 1) != ' ')) {
	      t++;
	      continue;
	    }
	    
	    if (*(t - 1) == '.')
	      t--;
	    g_string_append(ret, URL);
	    c = t;
	    break;
	  }
	  if (!t)
	    break;
	  t++;
	}
      }
    } else if (!g_ascii_strncasecmp(c, "ftp://", 6)) {
      t = c;
      while (1) {
	if (badchar(*t)) {
	  if (*(t - 1) == '.')
	    t--;
	  g_string_append(ret, URL);
	  c = t;
	  break;
	}
	if (!t)
	  break;
	t++;
	
      }
    } else if (!g_ascii_strncasecmp(c, "ftp.", 4)) {
      if (c[4] != '.') {
	t = c;
	while (1) {
	  if (badchar(*t)) {
	    if (t - c == 4) {
	      break;
	    }
	    if (*(t - 1) == '.')
	      t--;
	    g_string_append(ret, URL);
	    c = t;
	    break;
	  }
	  if (!t)
	    break;
	  t++;
	}
      }
    } else if (!g_ascii_strncasecmp(c, "mailto:", 7)) {
      t = c;
      while (1) {
	if (badchar(*t)) {
	  if (*(t - 1) == '.')
	    t--;
	  g_string_append(ret, URL);
	  c = t;
	  break;
	}
	if (!t)
	  break;
	t++;
	
      }
    } else if (c != text && (*c == '@')) {
      int flag;
      int len = 0;
      const char illegal_chars[] = "!@#$%^&*()[]{}/|\\<>\":;\r\n \0";
      url_buf[0] = 0;
      
      if (strchr(illegal_chars,*(c - 1)) || strchr(illegal_chars, *(c + 1)))
	flag = 0;
      else
	flag = 1;
      
      t = c;
      while (flag) {
	if (badchar(*t)) {
	  ret = g_string_truncate(ret, ret->len - (len - 1));
	  break;
	} else {
	  len++;
	  t--;
	  if (t < text) {
	    ret = g_string_assign(ret, "");
	    break;
	  }
	}
      }
      
      t = c + 1;
      
      while (flag) {
	if (badchar(*t)) {
	  g_string_append(ret, URL);
	  c = t;
	  
	  break;
	} else {
	  len++;
	}
	
	t++;
      }
    }
    
    if (*c == 0)
      break;
    
    ret = g_string_append_c(ret, *c);
    c++;
    
  }
  tmp = ret->str;
  g_string_free(ret, FALSE);
  return tmp;
}