From d3ab5dad5ed7438d9d59fa4e113778be8bec6e3b Mon Sep 17 00:00:00 2001
From: Jaewon Choi <jaewon.james.choi@gmail.com>
Date: Sun, 15 Oct 2017 14:08:06 +0900
Subject: [PATCH] WIP: Support single_command for pipe

---
 include/commands.h |  6 ++++++
 include/utils.h    |  8 +++++++-
 src/utils.c        | 30 ++++++++++++++++++++++++++----
 3 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/include/commands.h b/include/commands.h
index 0afab8b..20e9287 100644
--- a/include/commands.h
+++ b/include/commands.h
@@ -1,6 +1,12 @@
 #ifndef MYSH_COMMANDS_H_
 #define MYSH_COMMANDS_H_
 
+struct single_command
+{
+  int argc;
+  char** argv;
+};
+
 /**
   do_cd(argc, argv)
 
diff --git a/include/utils.h b/include/utils.h
index a84b441..6076d97 100644
--- a/include/utils.h
+++ b/include/utils.h
@@ -1,7 +1,13 @@
 #ifndef MYSH_UTILS_H_
 #define MYSH_UTILS_H_
 
+#include "commands.h"
+
 void mysh_parse_command(const char* command,
-                        int *argc, char*** argv);
+                        int* n_commands,
+                        struct single_command** commands);
+
+void parse_single_command(const char* command,
+                          int *argc, char*** argv);
 
 #endif // MYSH_UTILS_H_
diff --git a/src/utils.c b/src/utils.c
index 1785ed8..1d1ad39 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -4,15 +4,37 @@
 #include <string.h>
 
 void mysh_parse_command(const char* command,
-                        int *argc, char*** argv)
+                        int* n_commands,
+                        struct single_command** commands)
+{
+  const int kMaxPipes = 512;
+  *commands = (struct single_command*)malloc(sizeof(struct single_command) * kMaxPipes);
+
+  char buf[4096];
+  strcpy(buf, command);
+
+  char *saveptr = NULL;
+  char *tok = strtok_r(buf, "|", &saveptr);
+
+  int ti = 0;
+
+  while (tok != NULL) {
+  }
+
+  *n_commands = ti;
+}
+
+void parse_single_command(const char* command,
+                          int *argc, char*** argv)
 {
   const int kMaxArgc = 512;
-  *argv = (char**)malloc(kMaxArgc);
+  *argv = (char**)malloc(kMaxArgc * sizeof(char*));
 
   char buf[4096];
   strcpy(buf, command);
 
-  char *tok = strtok(buf, " \n\t");
+  char *saveptr = NULL;
+  char *tok = strtok_r(buf, " \n\t", &saveptr);
 
   int ti = 0;
 
@@ -22,7 +44,7 @@ void mysh_parse_command(const char* command,
 
     ++ti;
 
-    tok = strtok(NULL, " \n\t");
+    tok = strtok_r(NULL, " \n\t", &saveptr);
   }
 
   *argc = ti;
-- 
GitLab