From 7c52c2c1f277ada465bf5c526c096a7c8a954af7 Mon Sep 17 00:00:00 2001
From: JozanLeClerc <bousset.rudy@gmail.com>
Date: Tue, 18 Aug 2020 19:56:32 +0200
Subject: Cooliax

---
 TODO.org       |  2 +-
 src/m_prompt.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 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]);
 }
-- 
cgit v1.2.3