static int expCmdOutput(char *orig, char *new, int *oldl_ind, int *newl_ind)
{
char buf[BUF_SIZE];
int bytes_read;
int fd[2];
int parenthCount = 1;
int i = *oldl_ind + 1;
/* ENSURE MATCHING PARENS - REPLACE LAST PAREN WITH 0 */
while(parenthCount > 0)
{
if(orig[i] == '(') parenthCount++;
else if(orig[i] == ')') parenthCount--;
else if(orig[i] == 0)
{
fprintf(stderr, "./msh: missing )\n");
return 1;
}
i++;
}
orig[i-1] = 0;
/* PIPE, RECURSIVELY CALL PROCESSLINE(should pass 1 for 3rd arg), AND CLOSE WRITE END */
if(pipe (fd) < 0) perror("pipe");
processline(&(orig[*oldl_ind + 1]), fd[1], 1);
close(fd[1]);
/* READ OUTPUT OF COMMAND FROM READ END OF PIPE, THEN CLOSE READ END */
bytes_read = read(fd[0],buf,BUF_SIZE);
while(bytes_read > 0)
{
bytes_read = read(fd[0], buf, BUF_SIZE);
if (bytes_read == -1) perror("read");
}
close(fd[0]);
/* REPLACE ORIGINAL MATCHING PAREN, UPDATE oldl_ind */
orig[i-1] = ')';
*oldl_ind = i;
/* COPY OUTPUT OF COMMAND TO EXPANDED LINE, UPDATE newl_ind */
i = 0;
while(buf[i] != 0)
{
new[*newl_ind + i] = buf[i];
i++;
}
new[*newl_ind + i] = 0;
*newl_ind = *newl_ind + i;
/* REMOVING EXTRA LINES */
i = 0;
while(new[i])
{
if(new[i] == '\n') new[i] = ' ';
i++;
}
return 0;
}
int expand(char *orig, char *new, int newsize) //, int mainargc, char **mainargv, char **shiftedMArgV)
{
int newl_ind = 0;
int oldl_ind = 0;
int insideQuoteFlag = 0;
while(orig[oldl_ind] && newl_ind < newsize)
{
if(orig[oldl_ind] == '$')
{
if(orig[++oldl_ind] == '{') { if(expEnvVars(orig, new, &oldl_ind, &newl_ind)) return 1; }
else if(orig[oldl_ind] == '(') { if(expCmdOutput(orig, new, &oldl_ind, &newl_ind)) return 1; }
else if(orig[oldl_ind] == '$') { if(expShPid(orig, new, &oldl_ind, &newl_ind)) return 1; }
else if(isdigit(orig[oldl_ind])) { if(expMainArgs(orig, new, &oldl_ind, &newl_ind)) return 1; } //, mainargc, mainargv, shiftedMArgV)) return 1; }
else if(orig[oldl_ind] == '#') {
if(expMainCount(new, &newl_ind)) return 1;
oldl_ind++;
}
else if(orig[oldl_ind] == '?') {
if(expLastExitS(new, &newl_ind)) return 1;
oldl_ind++;
}
else
{
new[newl_ind] = orig[oldl_ind - 1];
newl_ind++;
}
}
else if(orig[oldl_ind] == '*')
{
if(orig[oldl_ind-1] == ' ' || orig[oldl_ind-1] == '"' || oldl_ind == 0)
{
if(orig[oldl_ind+1] == ' ' || orig[oldl_ind+1] == '"' || orig[oldl_ind+1] == 0)
{
if(expWildCard(orig, new, &oldl_ind, &newl_ind, 0)) return 1;
}
else
{
if(expWildCard(orig, new, &oldl_ind, &newl_ind, 1)) return 1;
}
}
else if(orig[oldl_ind-1] == '\\')
{
new[newl_ind-1] = '*';
oldl_ind++;
}
else
{
/*new[newl_ind] = '*';
newl_ind++;
oldl_ind++;*/
if(expLiteralChars(orig, new, &oldl_ind, &newl_ind, &insideQuoteFlag)) return 1;
}
}
else if(orig[oldl_ind] == '#' && !insideQuoteFlag) break;
else if(orig[oldl_ind] == '~' && orig[oldl_ind-1] == ' ')
{
if(expHomeDir(orig, new, &oldl_ind, &newl_ind)) return 1;
}
else
{
/*if(orig[oldl_ind] == '"') insideQuoteFlag = !insideQuoteFlag;
new[newl_ind] = orig[oldl_ind];
newl_ind++;
oldl_ind++;*/
if(expLiteralChars(orig, new, &oldl_ind, &newl_ind, &insideQuoteFlag)) return 1;
}
}
new[newl_ind] = 0;
return 0;
}