1

I was studying about pipes recently and saw this answer:

Connecting n commands with pipes in a shell?

I was intrigued about it and tried to make like a "dynamic" one, in which I introduce a string with n process and then execute the n process (i.e ls | sort). I was trying to tokenize, save in an array, but it did not work. Here is my code of my "tokenizer":

int main()
{
  char str[] = "ls | sort";
  int length = (sizeof(str) / sizeof(*str))-1;
  int sizeCMD = 1; //If the string has zero pipe, it means it has at least 1 process
  vector<char> tempV;
  for (int i = 0; i < length; i++)
  {
    if (str[i] == '|')
    {//If the string has one |, it means it has at least 2 process.
      sizeCMD++;
    }
    tempV.push_back(str[i]);//I was going to do something else with this, but I forgot.
    //cout<<i<<" "<<tempV.at(i)<<endl;
  }
  int j = 0;//Current position of the cmd

  string comLetter = "";//it will save every single letter in certain conditions

  string comLine = "";//it will save all the characters of comLetter in certain conditions

  struct command cmd[sizeCMD];
  const char *ls[2];
  const char *sort[2];
  const char *toCChar;
  for (int i = 0; i < tempV.size(); i++)
  {
    if (tempV.at(i) != ' ' && tempV.at(i) != '|')
    {//comLetter will only save characters that are not equal to blank or |.
      //cout<<tempV.at(i);
      comLetter += tempV.at(i);
      //cout<< comLetter <<endl;
    }

    if (tempV.at(i) == ' ' || i == tempV.size() - 1)
    {//comLine will save everything of comLetter when it detects a blank or the very end
      //cout<<comLetter<<endl;
      comLine = comLetter;
      comLetter = "";
    }

    if (tempV.at(i) == '|' || i == tempV.size() - 1)
    {//cmd will save everything of comLine when it detects a | or the very end.
      //cout<<j<<endl;
      cout << "." << comLine << "." << endl;
      //cout<<i<<endl;

      //cout<<toCChar<<endl;

      if(comLine == "ls"){
        toCChar = comLine.c_str();
        ls[0] = toCChar;
        ls[1] = 0;  //THIS IF
        cmd[0] = {ls};                 //WORKS
      }

      if(comLine == "sort"){
        sort[0] = "sort";
        sort[1] = 0;  //THIS IF
        cmd[1] = {sort};                 //WORKS
      }

      /*const char *ls[2];
      cout<<toCChar<<endl;
      ls[0] = toCChar;
      ls[1] = 0;
      cout<< *ls[0] << " - "<< endl;
      cmd[j] = {ls};
      //cout << cmd << endl;
      comLine = "";*/
      j++; //The position will move by one.
    }
  }

  return fork_pipes(sizeCMD, cmd);
}

Everything made sense to me, until I found out that const char* can't be temporal as it needs the data, so I need to create 2 const char* arrays for 2 commands. That's why I've two arrays: *sort[] and *ls[], for sort and ls.

Also, I was wondering, why these lines get "ignored":

toCChar = comLine.c_str();
ls[0] = toCChar;

I'm struggling right now, if someone could please help/guide me on how to do it, I would appreciate that.

0 Answers0