コード例 #1
0
ファイル: str.c プロジェクト: hollow/lucid
int str_path_isabs(const char *str)
{
	int abs = 1;

	if (str_isempty(str))
		return 0;

	if (*str != '/')
		return 0;

	strtok_t _st, *st = &_st, *p;

	if (!strtok_init_str(st, str, "/", 0))
		return -1;

	strtok_for_each(st, p) {
		if (str_equal(p->token, ".") || str_equal(p->token, "..") ||
		    !str_isgraph(p->token)) {
			abs = 0;
			break;
		}
	}

	strtok_free(st);

	return abs;
}
コード例 #2
0
ファイル: exec_replace.c プロジェクト: hollow/lucid
int exec_replace(const char *fmt, ...)
{
	va_list ap;
	va_start(ap, fmt);

	char *cmd;

	if (_lucid_vasprintf(&cmd, fmt, ap) == -1) {
		va_end(ap);
		return -1;
	}

	va_end(ap);

	strtok_t _st, *st = &_st;

	if (!strtok_init_str(st, cmd, " ", 0)) {
		free(cmd);
		return -1;
	}

	free(cmd);

	int argc    = strtok_count(st);
	char **argv = malloc((argc + 1) * sizeof(char *));

	if (!argv) {
		strtok_free(st);
		return -1;
	}

	if (strtok_toargv(st, argv) < 1) {
		free(argv);
		strtok_free(st);
		return -1;
	}

	execvp(argv[0], argv);

	/* never get here */
	free(argv);
	strtok_free(st);
	return -1;
}
コード例 #3
0
ファイル: strtok.c プロジェクト: gtk-gnutella/gtk-gnutella
/**
 * Free string token parsing object and nullify its pointer.
 */
void
strtok_free_null(strtok_t **s_ptr)
{
	strtok_t *s = *s_ptr;

	if (s != NULL) {
		strtok_free(s);
		*s_ptr = NULL;
	}
}
コード例 #4
0
ファイル: strtok.c プロジェクト: gtk-gnutella/gtk-gnutella
/**
 * Does a string, delimited by the supplied token separators, contain
 * the given string, with a case-insensitive (ASCII) comparison?
 * Leading and trailing whitespaces are ignored in tokens.
 *
 * @param string		the string to tokenize
 * @param delim			the token delimitors
 * @param what			the token to look for, case-insensitively
 */
bool
strtok_case_has(const char *string, const char *delim, const char *what)
{
	strtok_t *st;
	bool found = FALSE;

	st = strtok_make(string, TRUE, TRUE);

	while (
		strtok_next_internal(st, delim, TRUE, TRUE, NULL, what, TRUE, &found)
	) {
		if (found)
			break;
	}

	strtok_free(st);

	return found;
}
コード例 #5
0
ファイル: str.c プロジェクト: hollow/lucid
int str_path_isdot(const char *str)
{
	int found = 0;

	if (str_isempty(str))
		return 0;

	strtok_t _st, *st = &_st, *p;

	if (!strtok_init_str(st, str, "/", 0))
		return 0;

	strtok_for_each(st, p) {
		if (str_equal(p->token, ".") || str_equal(p->token, "..")) {
			found = 1;
			break;
		}
	}

	strtok_free(st);

	return found;
}
コード例 #6
0
ファイル: exec_fork.c プロジェクト: hollow/lucid
int exec_fork(const char *fmt, ...)
{
	va_list ap;
	va_start(ap, fmt);

	char *cmd;

	if (_lucid_vasprintf(&cmd, fmt, ap) == -1) {
		va_end(ap);
		return -1;
	}

	va_end(ap);

	strtok_t _st, *st = &_st;

	if (!strtok_init_str(st, cmd, " ", 0)) {
		free(cmd);
		return -1;
	}

	free(cmd);

	int argc    = strtok_count(st);
	char **argv = malloc((argc + 1) * sizeof(char *));

	if (!argv) {
		strtok_free(st);
		return -1;
	}

	if (strtok_toargv(st, argv) < 1) {
		free(argv);
		strtok_free(st);
		return -1;
	}

	pid_t pid;
	int status;

	switch ((pid = fork())) {
	case -1:
		return -1;

	case 0:
		usleep(200);
		execvp(argv[0], argv);

		/* never get here */
		exit(1);

	default:
		free(argv);
		strtok_free(st);

		if (waitpid(pid, &status, 0) == -1)
			return -1;
	}

	return status;
}