Want more features on Pastebin? Sign Up, it's FREE!
Guest

expand.c

By: a guest on Nov 18th, 2012  |  syntax: C  |  size: 3.40 KB  |  views: 169  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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. }
clone this paste RAW Paste Data