Advertisement
Guest User

alloc

a guest
Oct 17th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.54 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5.  
  6. int IsBadData(char *pointer) {
  7.   if (pointer == NULL) {
  8.     perror("Bad alloc");
  9.     free(pointer);
  10.     return 1;
  11.   }
  12.   return 0;
  13. }
  14.  
  15. int AddMemory(char *data, int *cap, int size) {
  16.   if (*cap == size) {
  17.     *cap *= 2;
  18.     data = (char*)realloc(data, *cap);
  19.     return IsBadData(data);
  20.   }
  21.   return 0;
  22. }
  23.  
  24. int CmpStrings(const void *left, const void *right) {
  25.   return strcmp(*(const char**)left, *(const char**)right);
  26. }
  27.  
  28. int peekchar() {
  29.   int c = getchar();
  30.   if (c != EOF) {
  31.     ungetc(c, stdin);  // puts it back
  32.   }
  33.   return c;
  34. }
  35.  
  36. int free_data(char **data, int size) {
  37.   for (int i = 0; i < size; ++i) {
  38.     free(data[i]);
  39.   }
  40.   free(data);
  41.   return 0;
  42. }
  43.  
  44. int AddZero(char **data, int data_size, int size, int *cap) {
  45.   if (data_size > 0) {
  46.     if (AddMemory(data[data_size - 1], cap, size)) {
  47.       free_data(data, data_size);
  48.       return 1;
  49.     }
  50.     data[data_size - 1][size++] = '\0';
  51.   }
  52.   return 0;
  53. }
  54.  
  55. int main() {
  56.   size_t capasity = 1000;
  57.   char** data = (char**)calloc(capasity, sizeof(char *));
  58.   if (data == NULL) {
  59.     perror("Bad alloc");
  60.     free(data);
  61.     return 1;
  62.   }
  63.  
  64.   int data_size = 0;
  65.   int size = 0; // size of current word
  66.   int cap;  // capasity of memory, that alloc for current word
  67.   int c;    // current char
  68.   int prev_c = ' '; // previous char
  69.   int quote = 0; // take the following values: 0, '\'', '\"'
  70.   while ((c = getchar()) != EOF) {
  71.     if (c == '\'' || c == '\"') {
  72.       if (quote == 0) {
  73.         quote = c;
  74.         continue;
  75.       }
  76.       else if (quote == c) {
  77.         quote = 0;
  78.         continue;
  79.       }
  80.     }
  81.     if (((c == '&' && peekchar() == '&') || (c == '|' && peekchar() == '|')) && quote == 0) {
  82.       if (AddZero(data, data_size, size, &cap)) {
  83.         return 1;
  84.       }
  85.       data[data_size++] = (char*)malloc(3 * sizeof(char));
  86.       if (IsBadData(data[data_size - 1])) {
  87.         free_data(data, data_size);
  88.         return 1;
  89.       }
  90.       data[data_size - 1][0] = c;
  91.       data[data_size - 1][1] = c;
  92.       getchar();
  93.       c = ' ';
  94.     }
  95.     else if ((c == ';' || c == '&' || c == '|') && quote == 0) {
  96.       if (AddZero(data, data_size, size, &cap)) {
  97.         return 1;
  98.       }
  99.       data[data_size++] = (char*)malloc(2 * sizeof(char));
  100.       if (IsBadData(data[data_size - 1])) {
  101.         free_data(data, data_size);
  102.         return 1;
  103.       }
  104.       data[data_size - 1][0] = c;
  105.       c = ' ';
  106.     }
  107.     else if (isspace(prev_c) && (!isspace(c) || quote != 0)) {
  108.       if (AddZero(data, data_size, size, &cap)) {
  109.         return 1;
  110.       }
  111.       data[data_size++] = (char*)malloc(sizeof(char));
  112.       if (IsBadData(data[data_size - 1])) {
  113.         free_data(data, data_size);
  114.         return 1;
  115.       }
  116.       cap = 1;
  117.       size = 0;
  118.       data[data_size - 1][size++] = c;
  119.     }
  120.     else if (!isspace(prev_c) && (!isspace(c) || quote != 0)) {
  121.       if (AddMemory(data[data_size - 1], &cap, size)) {
  122.         free_data(data, data_size);
  123.         return 1;
  124.       }
  125.       data[data_size - 1][size++] = c;
  126.     }
  127.     if (quote == 0) {
  128.       prev_c = c;
  129.     }
  130.     else {
  131.       prev_c = 'a';
  132.     }
  133.   }
  134.   if (AddZero(data, data_size, size, &cap)) {
  135.     return 1;
  136.   }
  137.   if (quote != 0) {
  138.     perror("Incorrect input");
  139.     free_data(data, data_size);
  140.     return 1;
  141.   }
  142.  
  143.   qsort(data, data_size, sizeof(char*), CmpStrings);
  144.   for (int i = 0; i < data_size; ++i) {
  145.     printf("\"%s\" \n", data[i]);
  146.   }
  147.   free_data(data, data_size);
  148.  
  149.   return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement