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; }