Exemplo n.º 1
0
static ssize_t buildpath(char *dst,size_t dstSize,const char *src) {
	const char *p = src;
	while(*p == '/')
		p++;

	int layer = 0;
	size_t count = 0;
	char *pathtemp = dst;
	while(*p) {
		int pos = strchri(p,'/');

		/* simply skip '.' */
		if(pos == 1 && p[0] == '.')
			p += 2;
		/* one layer back */
		else if(pos == 2 && p[0] == '.' && p[1] == '.') {
			if(layer > 0) {
				char *start = pathtemp;
				/* to last slash */
				while(*pathtemp != '/')
					pathtemp--;
				*pathtemp = '\0';
				count -= start - pathtemp;
				layer--;
			}
			p += 3;
		}
		else {
			if(dstSize - count < (size_t)(pos + 2))
				return count;
			/* append to path */
			pathtemp[0] = '/';
			strncpy(pathtemp + 1,p,pos);
			pathtemp[pos + 1] = '\0';
			pathtemp += pos + 1;
			count += pos + 1;
			p += pos + 1;
			layer++;
		}

		/* one step too far? */
		if(*(p - 1) == '\0')
			break;

		/* skip multiple '/' */
		while(*p == '/')
			p++;
	}

	/* terminate */
	if(dstSize - count < 2)
		return count;
	/* root? */
	if(pathtemp == dst) {
		*pathtemp++ = '/';
		count++;
	}
	*pathtemp = '\0';
	return count;
}
Exemplo n.º 2
0
int		scan_op(char **arg, t_lv *lv)
{
	ft_bzero((void *)lv->flag, 3);
	if ((lv->f = search_ope(&(*arg)[lv->d], "+-*%/=",
			strchri(&(*arg)[lv->d], ';'))))
	{
		if (lv->f == '=')
			return (0);
		lv->flag[0] = search_opi(&(*arg)[lv->d], "+-*%/=",
				strchri(&(*arg)[lv->d], ';'));
		lv->flag[1] = search_ope(ft_strchr(&(*arg)[lv->d],
			lv->f) + 1, "+-*%/=", 1);
	}
	else if (ft_strchr(cpy_to(&(*arg)[lv->d],
			search_opi(&(*arg)[lv->d], ";&<>|", 10000)), '.'))
		lv->f = '.';
	return (1);
}
Exemplo n.º 3
0
void		modif_e2(t_sh *t, t_linez *lz, int k, int *j)
{
	char	*tmp;
	int x = 0;
	if (ft_strncmp("unsetenv", lz->ep_l, 8))
	{
		tmp = ft_strdup(lz->ep_l);
		t->env = realloc_tb(t->env);
		if (search_oplen(&lz->ep_l[k], " =", 10000)
			< search_oplen(&lz->ep_l[k], "<>|&;", 10000))
		{
			if (ft_strchr(&(tmp[k]), '='))
			{
				t->env[++j[1]] = cpy_to(&(tmp[k]), '=');
				x = strchri(&(tmp[k]), '=');
				while (tmp[k + x] == ' ' || tmp[k + x] == '=')
					x++;
			}
			else
			{
				t->env[++j[1]] = cpy_to(&(tmp[k]), ' ');
				x = strchri(&(tmp[k]), ' ');
				while (tmp[k + x] == ' ' || tmp[k + x] == '=')
					x++;
			}
		}
		else
			t->env[++j[1]] = ft_strdup(&(tmp[k]));
		if (x && tmp[k + x])
		{
			replace_char(t->env[j[1]], '=', ' ');
			t->env[j[1]] = epur_str(t->env[j[1]], t);
			if (t->env[j[1]][len(t->env[j[1]]) - 1] == ' ')
				t->env[j[1]][len(t->env[j[1]]) - 1] = '\0';
			t->env[j[1]] = ft_strjoin_free(t->env[j[1]], "=", 1);
			t->env[j[1]] = ft_strjoin_free(t->env[j[1]], &tmp[k + x], 1);
		}
		else
			t->env[j[1]] = ft_strjoin_free(t->env[j[1]], "=", 1);
		ft_strdel(&tmp);
	}
	t->env[++j[1]] = 0;
}
Exemplo n.º 4
0
char		*set_local_var(char **arg, int opt, t_sh *t)
{
	static char	**vars = NULL;
	t_lv		*lv;
	int			i;

	i = -1;
	lv = (t_lv *)malloc(sizeof(t_lv));
	lv->d = strchri((*arg), '$');
	if (vars && (opt == 6 || opt == 7))
		return (find_del(vars, arg, opt));
	if (vars && opt == 1)
	{
		if (!scan_op(arg, lv))
			return (NULL);
		i = search_cmp(i, vars, cpy_to(&((*arg)[lv->d + 1]), ';'));
		lv->o = search_ope(&(*arg)[lv->d], t->ope, len(&(*arg)[lv->d]));
		lv->a = ft_strsub((*arg), 0, lv->d);
		lv->b = ft_strdup(ft_strchr(&(*arg)[lv->d], lv->o));
		if (vars[i])
			found_var(vars, lv, arg, i);
		else
		{
			ft_strdel(arg);
			*arg = ft_strjoin_free(lv->a, lv->b, 3);
		}
		return (*arg);
	}
	if (opt == 1 || opt == 6 || opt == 7)
		return (NULL);
	if (!vars)
	{
		vars = (char **)malloc(sizeof(char *) * 100);
		vars[0] = NULL;
	}
	free(lv);
	return (assign_alias(vars, i, arg));
}