summaryrefslogtreecommitdiffstats
path: root/src/u_vars.c
blob: 2b6fe96a0599818e120f4ba01ec44b2fe10f9e2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   u_vars.c                                           :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: rbousset <marvin@42.fr>                    +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2020/02/14 17:19:27 by rbousset          #+#    #+#             */
/*   Updated: 2020/02/14 17:19:29 by rbousset         ###   ########lyon.fr   */
/*                                                                            */
/* ************************************************************************** */

#include <libft.h>
#include <stdlib.h>

#include "d_define.h"
#include "f_fail.h"
#include "s_destroy.h"
#include "s_line.h"
#include "s_struct.h"
#include "u_utils.h"

static void		u_get_frm_env(char str[],
						const char varname[],
						size_t dstsize,
						t_msh *msh)
{
	char	**env_dup;
	char	*pp_env;
	size_t	i;

	env_dup = u_get_env_var_names(msh);
	i = 0;
	while (env_dup[i] != NULL)
	{
		if (ft_strncmp(varname + 1, env_dup[i], ft_strlen(env_dup[i]) + 1) == 0)
		{
			pp_env = msh->envp[i];
			while (*pp_env != '\0' && *pp_env != '=')
				pp_env += 1;
			if (*pp_env == '=')
				pp_env += 1;
			ft_strlcpy(str, pp_env, dstsize);
			ft_delwords(env_dup);
			return ;
		}
		i++;
	}
	ft_delwords(env_dup);
}

static void		u_get_special_var(char str[],
							const char varname[],
							size_t dstsize,
							t_msh *msh)
{
	char	tmp[255];
	int		n;

	if (ft_strncmp(varname, M_RET_VAR, 3) == 0)
	{
		ft_uitoa_s(tmp, msh->ret);
		ft_strlcpy(str, tmp, 4);
	}
	else if (ft_strncmp(varname, M_ARGC_VAR, 3) == 0)
	{
		ft_uitoa_s(tmp, msh->argc);
		ft_strlcpy(str, tmp, 255);
	}
	else if (ft_strlen(varname) == 2 && ft_isdigit(*(varname + 1)) == TRUE)
	{
		if ((n = ft_atoi(varname + 1)) <= msh->argc)
			ft_strlcpy(str, msh->argv[n], dstsize);
		else
			(void)ft_memcpy(str, "", 1 * sizeof(char));
	}
}

void			u_get_custom_var(char str[],
					const char varname[],
					size_t dstsize,
					t_msh *msh)
{
	t_lvars	*ptr;

	ptr = msh->vars;
	while (ptr != NULL &&
		ft_strncmp(varname + 1, ptr->name, ft_strlen(varname + 1) + 1) != 0)
	{
		ptr = ptr->next;
	}
	if (ptr != NULL)
	{
		ft_strlcpy(str, ptr->val, dstsize);
	}
}

/*
** unsigned char
** u_get_var_value(char str[], const char varname[], size_t dstsize, t_msh *msh)
**
** DESCRIPTION
** The u_get_var_value() function fills
** str[] with a null-terminated string
** containing the value of the variable varname[]
** including the '$' prefix, in a similar way as
** sprintf does. No more than dstsize bytes will be
** copied into str[]. str[0] is set to \000 if
** varname[] wasn't found.
*/

unsigned char	u_get_var_value(char str[],
								const char varname[],
								size_t dstsize,
								t_msh *msh)
{
	str[0] = C_NUL;
	u_get_special_var(str, varname, dstsize, msh);
	if (str[0] != C_NUL)
	{
		return (0);
	}
	u_get_custom_var(str, varname, dstsize, msh);
	if (str[0] != C_NUL)
	{
		return (0);
	}
	u_get_frm_env(str, varname, dstsize, msh);
	if (str[0] != C_NUL)
	{
		return (0);
	}
	return (1);
}