Advertisement
Guest User

c-program-strings-Program a-la strings

a guest
Oct 17th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.58 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<ctype.h>
  5.  
  6. int free_data(char **data, int size) {
  7.   for (int i = 0; i < size; ++i) {
  8.     free(data[i]);
  9.   }
  10.   free(data);
  11.   return 0;
  12. }
  13.  
  14. int isquote(int c) {
  15.   return ((c < 32 && c != '\t') || c > 126);
  16. }
  17.  
  18. int IsBadData(char *pointer) {
  19.   if (pointer == NULL) {
  20.     perror("Bad alloc");
  21.     free(pointer);
  22.     return 1;
  23.   }
  24.   return 0;
  25. }
  26.  
  27. int AddMemory(char *data, int *cap, int size) {
  28.   if (*cap == size) {
  29.     *cap *= 2;
  30.     data = (char*)realloc(data, *cap);
  31.     return IsBadData(data);
  32.   }
  33.   return 0;
  34. }
  35.  
  36. int strings(FILE * input) {
  37.   size_t capasity = 1 << 17;
  38.   char **data = (char**)calloc(capasity, sizeof(char*));
  39.   if (data == NULL) {
  40.     perror("Allocation error");
  41.     free_data(data, 0);
  42.     return 1;
  43.   }
  44.  
  45.   int data_size = 0;
  46.   int size = 4; // size of current word
  47.   int cap;  // capasity of memory, that alloc for current word
  48.   int c;    // current char
  49.   int prev_c = 1; // previous char
  50.   while ((c = fgetc(input)) != EOF) {
  51.     if (isquote(prev_c) && !isquote(c)) {
  52.       if (size < 4) {
  53.         free(data[data_size - 1]);
  54.       }
  55.       else {
  56.         if (data_size > 0) {
  57.           if (AddMemory(data[data_size - 1], &cap, size)) {
  58.             free_data(data, data_size);
  59.             return 0;
  60.           }
  61.           data[data_size - 1][size++] = '\0';
  62.         }
  63.         ++data_size;
  64.       }
  65.       data[data_size - 1] = (char*)malloc(sizeof(char) * 4);
  66.       if (IsBadData(data[data_size - 1])) {
  67.         free_data(data, data_size);
  68.         return 0;
  69.       }
  70.       cap = 4;
  71.       size = 0;
  72.       data[data_size - 1][size++] = c;
  73.     }
  74.     else if (!isquote(prev_c) && !isquote(c)) {
  75.       if (AddMemory(data[data_size - 1], &cap, size)) {
  76.         free_data(data, data_size);
  77.         return 0;
  78.       }
  79.       data[data_size - 1][size++] = c;
  80.     }
  81.     prev_c = c;
  82.   }
  83.   if (size < 4) {
  84.     free(data[data_size - 1]);
  85.     --data_size;
  86.   }
  87.   else if (data_size > 0) {
  88.     if (AddMemory(data[data_size - 1], &cap, size)) {
  89.       free_data(data, data_size);
  90.       return 0;
  91.     }
  92.     data[data_size - 1][size++] = '\0';
  93.   }
  94.  
  95.   for (int i = 0; i < data_size; ++i) {
  96.     printf("%s\n", data[i]);
  97.   }
  98.  
  99.   free_data(data, data_size);
  100.   return 0;
  101. }
  102.  
  103. int main(int argc, char **argv) {
  104.   if (argc == 1) {
  105.     strings(stdin);
  106.   }
  107.   else {
  108.     for (int i = 1; i < argc; ++i) {
  109.       FILE *fin = fopen(argv[i], "r");
  110.       if (fin != NULL) {
  111.         strings(fin);
  112.         fclose(fin);
  113.       }
  114.       else {
  115.         perror("Invalid file");
  116.       }
  117.     }
  118.   }
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement