Advertisement
volkovich_maksim

ырудд_зшзу

Dec 15th, 2016
528
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.89 KB | None | 0 0
  1. #include <string.h>
  2. #include <unistd.h>
  3. #include <sys/wait.h>
  4. #include <sys/types.h>
  5. #include <stdio.h>
  6. #include <errno.h>
  7. #include <ctype.h>
  8. #include "util.h"
  9. #include <stdlib.h>
  10.  
  11. #define max_words 30
  12.  
  13. typedef struct arg_list{
  14.     struct arg_list *next;
  15.     char* arg;
  16. }arg_list;
  17.  
  18. typedef struct pr_list{
  19.     pid_t pid;
  20.     char *pr;
  21.     arg_list *args;
  22.     struct pr_list *next;
  23. }pr_list;
  24.  
  25. typedef struct pipe_list{
  26.     char *line;
  27.     struct pipe_list *next;
  28.     pr_list *prs;
  29. }pipe_list;
  30.  
  31. void printf_args(arg_list *curr){
  32.     arg_list *pointer;
  33.     pointer = curr;
  34.     if (curr != NULL){
  35.         if (pointer->arg != NULL){
  36.             printf("%s ", pointer->arg);
  37.             while (pointer->next){
  38.                 pointer = (pointer->next);
  39.                 if (pointer->arg != NULL){
  40.                     if (!strcmp(pointer->arg, "")){
  41.                         printf("ПУСТАЯ СТРОКА\n");
  42.                     }else printf("%s ", pointer->arg);
  43.                 }
  44.             }
  45.         }
  46.     }
  47. }
  48.  
  49. void printf_prs(pr_list *curr){
  50.     pr_list *pointer;
  51.     pointer = curr;
  52.     if (curr != NULL){
  53.         if (pointer->pr != NULL){
  54.             printf("%s ", pointer->pr);
  55.             printf_args(pointer->args);
  56.             while (pointer->next != NULL){
  57.                 pointer = (pointer->next);
  58.                 printf("| ");
  59.                 if (pointer->pr != NULL){
  60.                     if (!strcmp(pointer->pr, "")){
  61.                         printf("ПУСТАЯ СТРОКА\n");
  62.                     }else printf("%s ", pointer->pr);
  63.                 printf_args(pointer->args);
  64.                 }              
  65.             }
  66.         }
  67.     }
  68.     printf("\n");
  69. }
  70.  
  71. int word_counter(arg_list *curr){
  72.     int i = 0;
  73.     arg_list *pointer;
  74.     pointer = curr;
  75.     if (curr != NULL){
  76.         if (curr->arg != NULL){
  77.             i++;
  78.             while (curr->next != NULL){
  79.                 pointer = curr->next;
  80.                 if (curr->arg)
  81.                     i++;
  82.                 curr = pointer;
  83.             }
  84.         }
  85.     }
  86.     return i;
  87. }
  88.  
  89. /*  MAIN    */
  90.  
  91. int main(int argc, char *argv[]){
  92.     int i, j, k, len, pipe_flag, pr_flag, arg_flag, not_empty, back_mode, word_begin, word_end;
  93.     char *new_line, *cur_word;
  94.     pipe_list *c_pipe;
  95.     pr_list *c_pr;
  96.     arg_list *c_arg;
  97.    
  98.     c_pipe = calloc(1, sizeof(pipe_list));
  99.     c_pipe->next = calloc(1, sizeof(pipe_list));
  100.     c_pipe->prs = calloc(1, sizeof(pr_list));
  101.     c_pipe->prs->args = calloc(1, sizeof(arg_list));
  102.     c_pipe->line = NULL;
  103.     c_pipe->next = NULL;
  104.     c_pr = c_pipe->prs;
  105.     c_pr->pr = NULL;
  106.     c_pr->next = NULL;
  107.     c_arg = c_pr->args;
  108.     c_arg->next = NULL;
  109.     c_arg->arg = NULL;
  110.  
  111.     pipe_list *executing_pipes = calloc(1, sizeof(pipe_list));
  112.     executing_pipes = c_pipe;
  113.  
  114.     pipe_flag = 1;
  115.  
  116.     while ((new_line = getline_unlim()) != NULL){
  117.         if (pipe_flag){
  118.             c_pipe->next = malloc(sizeof(pipe_list));
  119.             c_pipe = c_pipe->next;
  120.             c_pipe->prs = malloc(sizeof(pr_list));
  121.             c_pipe->prs->args = malloc(sizeof(arg_list));
  122.             c_pipe->line = NULL;
  123.             c_pipe->next = NULL;
  124.             c_pr = c_pipe->prs;
  125.             c_pr->pr = NULL;
  126.             c_pr->next = NULL;
  127.             c_arg = c_pr->args;
  128.             c_arg->next = NULL;
  129.             c_arg->arg = NULL;
  130.             pipe_flag = 0;
  131.         }
  132.  
  133.         len = strlen(new_line);
  134.  
  135.         /* processing line, creating pipe */
  136.         c_pipe->line = calloc(len + 1, sizeof(char));
  137.         for (i = 0; i < len + 1; i++){
  138.             c_pipe->line[i] = new_line[i];
  139.         }
  140.  
  141.         pr_flag = 0; arg_flag = 0;
  142.         word_begin = 0; word_end = 0;
  143.         not_empty = 0; back_mode = 0;
  144.         for (i = 0; i < len; i++){
  145.             if (pr_flag){;
  146.                 c_pr->next = malloc(sizeof(pr_list));
  147.                 c_pr->next->args = malloc(sizeof(arg_list));
  148.                 c_pr = c_pr->next;
  149.                 c_pr->next = NULL;
  150.                 c_pr->pr = NULL;
  151.                 c_arg = c_pr->args;
  152.                 c_arg->next = NULL;
  153.                 c_arg->arg = NULL;
  154.                 pr_flag = 0;
  155.             }else if (arg_flag){
  156.                 c_arg->next = malloc(sizeof(arg_list));
  157.                 c_arg = c_arg->next;
  158.                 c_arg->arg = NULL;
  159.                 c_arg->next = NULL;
  160.                 arg_flag = 0;
  161.             }
  162.  
  163.             if ((!isalnum(new_line[i]) && new_line[i] != '-')){
  164.                 if (new_line[i] == '|'){
  165.                     pr_flag = 1;
  166.                     arg_flag = 0;
  167.                     not_empty = 0;
  168.                 }
  169.                 if (new_line[i] == '&'){
  170.                     back_mode = 1;
  171.                 }
  172.                 new_line[i] = '\0';
  173.                 word_end = i;//
  174.  
  175.                 k = word_end - word_begin;
  176.                 if (k != 0){
  177.                     cur_word = malloc(sizeof(char));
  178.                     cur_word = realloc(cur_word, k);
  179.                     for (j = 0; j < k; j++){
  180.                         cur_word[j] = new_line[word_begin + j];
  181.                     }
  182.                     word_begin = i + 1;
  183.                 }
  184.                 if (word_begin != word_end){
  185.                     if (!not_empty){
  186.                         c_pr->pr = malloc(sizeof(char));
  187.                         c_pr->pr = realloc(c_pr->pr, strlen(cur_word) + 1);
  188.                         if (strcmp(cur_word,"")){
  189.                             k = strlen(cur_word);
  190.                             for (j = 0; j < k; j++){
  191.                                 c_pr->pr[j] = cur_word[j];
  192.                             }
  193.                             c_pr->pr[j] = '\0';
  194.                             free(cur_word);
  195.                             not_empty = 1;
  196.                             continue;
  197.                         }
  198.                     }else{
  199.                         c_arg->arg = malloc(sizeof(char));
  200.                         c_arg->arg = realloc(c_arg->arg, strlen(cur_word));
  201.                         if (strcmp(cur_word,"")){
  202.                             k = strlen(cur_word);
  203.                             for (j = 0; j < k; j++){
  204.                                 c_arg->arg[j] = cur_word[j];
  205.                             }
  206.                             free(cur_word);
  207.                             arg_flag = 1;
  208.                             continue;
  209.                         }
  210.                     }
  211.                 }
  212.             }
  213.         }
  214.         k = i - word_begin;
  215.         if (k != 0){
  216.             cur_word = malloc(sizeof(char));
  217.             cur_word = realloc(cur_word, k);
  218.             for (j = 0; j < k; j++){
  219.                 cur_word[j] = new_line[word_begin + j];
  220.             }
  221.         }
  222.         if (word_begin != i){
  223.             if (!not_empty){
  224.                 c_pr->pr = malloc(sizeof(char));
  225.                 c_pr->pr = realloc(c_pr->pr, strlen(cur_word) + 1);
  226.                 if (strcmp(cur_word,"")){
  227.                     k = strlen(cur_word);
  228.                     for (j = 0; j < k; j++){
  229.                         c_pr->pr[j] = cur_word[j];
  230.                     }
  231.                     c_pr->pr[j] = '\0';
  232.                     free(cur_word);
  233.                     not_empty = 1;
  234.                 }
  235.             }else{
  236.                 c_arg->arg = malloc(sizeof(char));
  237.                 c_arg->arg = realloc(c_arg->arg, strlen(cur_word));
  238.                 if (strcmp(cur_word,"")){
  239.                     k = strlen(cur_word);
  240.                     for (j = 0; j < k; j++){
  241.                         c_arg->arg[j] = cur_word[j];
  242.                     }
  243.                     free(cur_word);
  244.                     arg_flag = 1;
  245.                 }
  246.             }
  247.         }
  248.  
  249.         /* pipe was created */
  250.  
  251.         /*  executing pipe  */
  252.         /*                  */
  253.  
  254.         printf_prs(c_pipe->prs);
  255.         if (!back_mode){
  256.             if (c_pipe && c_pipe->prs){
  257.                 c_pr = c_pipe->prs;
  258.                 if (c_pr->args != NULL){
  259.                     j = 2 + word_counter(c_pr->args);
  260.                 }
  261.                 else j = 2;
  262.                 printf("%d\n", j);
  263.                 char* exec_arg[j];
  264.                 for (i = 0; i < j; i++){
  265.                     exec_arg[i] = calloc(2, sizeof(char*));
  266.                 }
  267.                 c_arg = (c_pr->args);
  268.                 int k, word_len;
  269.                 if (c_pr){
  270.                     word_len = strlen(c_pr->pr);
  271.                     for (i = 0; i < 2; i++){
  272.                         for (k = 0; k < word_len && c_pr->pr[k] != '\0'; j++){
  273.                             exec_arg[i][k] = c_pr->pr[k];
  274.                             exec_arg[i] = realloc(exec_arg[i], k + 1);
  275.                         }
  276.                         for (; k < word_len; j++){
  277.                             exec_arg[i][k] = '\0';
  278.                         }
  279.                     }
  280.                     /*for (; i <= j && flag; i++){
  281.                         for (j = 0; j < word_len && c_arg->arg[j] != '\0' ; j++){
  282.                             exec_arg[i][j] = c_arg->arg[j];
  283.                         }
  284.                         for (; j < word_len; j++){
  285.                             exec_arg[i][j] = '\0';
  286.                         }
  287.                         if (c_arg->next != NULL){
  288.                         c_arg = c_arg->next;
  289.                         }else{
  290.                             flag = 0;
  291.                         }
  292.                     }*/
  293.                 }
  294.  
  295.                 /*for (i; i < j; i++)
  296.                     printf("%s ", mass[i]);
  297.                 printf("\n");*/
  298.             }
  299.         }else{
  300.             printf("background mode\n");
  301.         }
  302.         pipe_flag = 0;
  303.     }  
  304.     return 0;
  305. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement