summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--TODO.org2
-rw-r--r--src/m_prompt.c62
2 files changed, 60 insertions, 4 deletions
diff --git a/TODO.org b/TODO.org
index ab74e4e..414de31 100644
--- a/TODO.org
+++ b/TODO.org
@@ -25,4 +25,4 @@
** TODO [#C] [ builtin <=== pretty cool yet simple stuff ( [ $a -eq 1 ] )
** TODO [#C] alias
** DONE [#C] Read scripts
-** TODO [#C] PSX rice
+** DONE [#C] PSX rice
diff --git a/src/m_prompt.c b/src/m_prompt.c
index 3bffffd..887fbbe 100644
--- a/src/m_prompt.c
+++ b/src/m_prompt.c
@@ -14,12 +14,67 @@
#include <stdint.h>
#include <unistd.h>
+#include "d_define.h"
#include "m_prompt.h"
#include "s_struct.h"
#include "u_vars.h"
+static char
+ *m_subst_prompt_rice(char var[],
+ t_msh *msh)
+{
+ size_t i;
+ size_t j;
+ char *tmp;
+
+ i = 0;
+ while (var[i] != '\0')
+ {
+ if (var[i] == '\\')
+ {
+ if (var[i + 1] == 'w')
+ {
+ tmp = u_get_var_value("$PWD", msh);
+ if (tmp != NULL)
+ {
+ var = ft_strsubst(var, "\\w", tmp);
+ ft_memdel((void*)&tmp);
+ }
+ else
+ var = ft_strsubst(var, "\\w", "?");
+ }
+ else if (var[i + 1] == 'W')
+ {
+ tmp = u_get_var_value("$PWD", msh);
+ if (tmp != NULL)
+ {
+ j = ft_strlen(tmp);
+ if (j > 1)
+ {
+ while (tmp[j] != '/' && j != 0)
+ j--;
+ j++;
+ ft_memmove(tmp, tmp + j, (ft_strlen(tmp) - j) + 1);
+ }
+ var = ft_strsubst(var, "\\W", tmp);
+ ft_memdel((void*)&tmp);
+ }
+ else
+ var = ft_strsubst(var, "\\w", "?");
+ }
+ else if (var[i + 1] == 'v')
+ var = ft_strsubst(var, "\\v", FT_MSH_VERSION);
+ else if (var[i + 1] == 's')
+ var = ft_strsubst(var, "\\s", FT_PROGNAME);
+ }
+ i++;
+ }
+ return (var);
+}
+
static void
- m_update_psx(uint8_t x, t_msh *msh)
+ m_update_psx(uint8_t x,
+ t_msh *msh)
{
char *var;
char psx[5];
@@ -30,14 +85,15 @@ static void
msh->ps[x - 1][0] = '\0';
return ;
}
+ var = m_subst_prompt_rice(var, msh);
ft_strlcpy(msh->ps[x - 1], var, ft_strlen(var) + 1);
ft_memdel((void*)&var);
}
void
- m_prompt_psx(uint8_t x, t_msh *msh)
+ m_prompt_psx(uint8_t x,
+ t_msh *msh)
{
-
m_update_psx(1, msh);
ft_dprintf(STDERR_FILENO, "%s", msh->ps[x - 1]);
}