Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<ctype.h>
- int free_data(char **data, int size) {
- for (int i = 0; i < size; ++i) {
- free(data[i]);
- }
- free(data);
- return 0;
- }
- int isquote(int c) {
- return ((c < 32 && c != '\t') || c > 126);
- }
- int IsBadData(char *pointer) {
- if (pointer == NULL) {
- perror("Bad alloc");
- free(pointer);
- return 1;
- }
- return 0;
- }
- int AddMemory(char *data, int *cap, int size) {
- if (*cap == size) {
- *cap *= 2;
- data = (char*)realloc(data, *cap);
- return IsBadData(data);
- }
- return 0;
- }
- int strings(FILE * input) {
- size_t capasity = 1 << 17;
- char **data = (char**)calloc(capasity, sizeof(char*));
- if (data == NULL) {
- perror("Allocation error");
- free_data(data, 0);
- return 1;
- }
- int data_size = 0;
- int size = 4; // size of current word
- int cap; // capasity of memory, that alloc for current word
- int c; // current char
- int prev_c = 1; // previous char
- while ((c = fgetc(input)) != EOF) {
- if (isquote(prev_c) && !isquote(c)) {
- if (size < 4) {
- free(data[data_size - 1]);
- }
- else {
- if (data_size > 0) {
- if (AddMemory(data[data_size - 1], &cap, size)) {
- free_data(data, data_size);
- return 0;
- }
- data[data_size - 1][size++] = '\0';
- }
- ++data_size;
- }
- data[data_size - 1] = (char*)malloc(sizeof(char) * 4);
- if (IsBadData(data[data_size - 1])) {
- free_data(data, data_size);
- return 0;
- }
- cap = 4;
- size = 0;
- data[data_size - 1][size++] = c;
- }
- else if (!isquote(prev_c) && !isquote(c)) {
- if (AddMemory(data[data_size - 1], &cap, size)) {
- free_data(data, data_size);
- return 0;
- }
- data[data_size - 1][size++] = c;
- }
- prev_c = c;
- }
- if (size < 4) {
- free(data[data_size - 1]);
- --data_size;
- }
- else if (data_size > 0) {
- if (AddMemory(data[data_size - 1], &cap, size)) {
- free_data(data, data_size);
- return 0;
- }
- data[data_size - 1][size++] = '\0';
- }
- for (int i = 0; i < data_size; ++i) {
- printf("%s\n", data[i]);
- }
- free_data(data, data_size);
- return 0;
- }
- int main(int argc, char **argv) {
- if (argc == 1) {
- strings(stdin);
- }
- else {
- for (int i = 1; i < argc; ++i) {
- FILE *fin = fopen(argv[i], "r");
- if (fin != NULL) {
- strings(fin);
- fclose(fin);
- }
- else {
- perror("Invalid file");
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement