Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement