1. static int expCmdOutput(char *orig, char *new, int *oldl_ind, int *newl_ind)
  2. {
  3.     char buf[BUF_SIZE];
  4.     int bytes_read;
  5.     int fd[2];
  6.     int parenthCount = 1;
  7.     int i = *oldl_ind + 1;
  8.    
  9.     /* ENSURE MATCHING PARENS - REPLACE LAST PAREN WITH 0 */
  10.     while(parenthCount > 0)
  11.     {
  12.         if(orig[i] == '(') parenthCount++;
  13.         else if(orig[i] == ')') parenthCount--;
  14.         else if(orig[i] == 0)
  15.         {
  16.             fprintf(stderr, "./msh: missing )\n");
  17.             return 1;
  18.         }
  19.         i++;
  20.     }
  21.     orig[i-1] = 0;
  22.    
  23.     /* PIPE, RECURSIVELY CALL PROCESSLINE(should pass 1 for 3rd arg), AND CLOSE WRITE END */
  24.     if(pipe (fd) < 0) perror("pipe");
  25.     processline(&(orig[*oldl_ind + 1]), fd[1], 1);
  26.     close(fd[1]);
  27.    
  28.     /* READ OUTPUT OF COMMAND FROM READ END OF PIPE, THEN CLOSE READ END */
  29.     bytes_read = read(fd[0],buf,BUF_SIZE);
  30.     while(bytes_read > 0)
  31.     {
  32.         bytes_read = read(fd[0], buf, BUF_SIZE);
  33.         if (bytes_read == -1) perror("read");
  34.     }
  35.     close(fd[0]);
  36.    
  37.     /* REPLACE ORIGINAL MATCHING PAREN, UPDATE oldl_ind */
  38.     orig[i-1] = ')';
  39.     *oldl_ind = i;
  40.    
  41.     /* COPY OUTPUT OF COMMAND TO EXPANDED LINE, UPDATE newl_ind */
  42.     i = 0;
  43.     while(buf[i] != 0)
  44.     {
  45.         new[*newl_ind + i] = buf[i];
  46.         i++;
  47.     }
  48.     new[*newl_ind + i] = 0;
  49.     *newl_ind = *newl_ind + i;
  50.    
  51.     /* REMOVING EXTRA LINES */
  52.     i = 0;
  53.     while(new[i])
  54.     {
  55.         if(new[i] == '\n') new[i] = ' ';
  56.         i++;
  57.     }
  58.    
  59.     return 0;
  60. }
  61.  
  62. int expand(char *orig, char *new, int newsize) //, int mainargc, char **mainargv, char **shiftedMArgV)
  63. {
  64.     int newl_ind = 0;
  65.     int oldl_ind = 0;
  66.     int insideQuoteFlag = 0;
  67.  
  68.     while(orig[oldl_ind] && newl_ind < newsize)
  69.     {
  70.         if(orig[oldl_ind] == '$')
  71.         {
  72.             if(orig[++oldl_ind] == '{') { if(expEnvVars(orig, new, &oldl_ind, &newl_ind)) return 1; }
  73.             else if(orig[oldl_ind] == '(') { if(expCmdOutput(orig, new, &oldl_ind, &newl_ind)) return 1; }
  74.             else if(orig[oldl_ind] == '$') { if(expShPid(orig, new, &oldl_ind, &newl_ind)) return 1; }
  75.             else if(isdigit(orig[oldl_ind])) { if(expMainArgs(orig, new, &oldl_ind, &newl_ind)) return 1; } //, mainargc, mainargv, shiftedMArgV)) return 1; }
  76.             else if(orig[oldl_ind] == '#') {
  77.                 if(expMainCount(new, &newl_ind)) return 1;
  78.                 oldl_ind++;
  79.             }
  80.             else if(orig[oldl_ind] == '?') {
  81.                 if(expLastExitS(new, &newl_ind)) return 1;
  82.                 oldl_ind++;
  83.             }
  84.             else
  85.             {
  86.                 new[newl_ind] = orig[oldl_ind - 1];
  87.                 newl_ind++;
  88.             }
  89.         }
  90.         else if(orig[oldl_ind] == '*')
  91.         {
  92.             if(orig[oldl_ind-1] == ' ' || orig[oldl_ind-1] == '"' || oldl_ind == 0)
  93.             {
  94.                 if(orig[oldl_ind+1] == ' ' || orig[oldl_ind+1] == '"' || orig[oldl_ind+1] == 0)
  95.                 {
  96.                     if(expWildCard(orig, new, &oldl_ind, &newl_ind, 0)) return 1;
  97.                 }
  98.                 else
  99.                 {
  100.                     if(expWildCard(orig, new, &oldl_ind, &newl_ind, 1)) return 1;
  101.                 }
  102.             }
  103.             else if(orig[oldl_ind-1] == '\\')
  104.             {
  105.                 new[newl_ind-1] = '*';
  106.                 oldl_ind++;
  107.             }
  108.             else
  109.             {
  110.                 /*new[newl_ind] = '*';
  111.                 newl_ind++;
  112.                 oldl_ind++;*/
  113.                 if(expLiteralChars(orig, new, &oldl_ind, &newl_ind, &insideQuoteFlag)) return 1;
  114.             }
  115.         }
  116.         else if(orig[oldl_ind] == '#' && !insideQuoteFlag) break;
  117.         else if(orig[oldl_ind] == '~' && orig[oldl_ind-1] == ' ')
  118.         {
  119.             if(expHomeDir(orig, new, &oldl_ind, &newl_ind)) return 1;
  120.         }
  121.         else
  122.         {
  123.             /*if(orig[oldl_ind] == '"') insideQuoteFlag = !insideQuoteFlag;
  124.             new[newl_ind] = orig[oldl_ind];
  125.             newl_ind++;
  126.             oldl_ind++;*/
  127.             if(expLiteralChars(orig, new, &oldl_ind, &newl_ind, &insideQuoteFlag)) return 1;
  128.         }
  129.     }
  130.     new[newl_ind] = 0;
  131.     return 0;
  132. }