Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <string.h>
- 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 CmpStrings(const void *left, const void *right) {
- return strcmp(*(const char**)left, *(const char**)right);
- }
- int peekchar() {
- int c = getchar();
- if (c != EOF) {
- ungetc(c, stdin); // puts it back
- }
- return c;
- }
- int free_data(char **data, int size) {
- for (int i = 0; i < size; ++i) {
- free(data[i]);
- }
- free(data);
- return 0;
- }
- int AddZero(char **data, int data_size, int size, int *cap) {
- if (data_size > 0) {
- if (AddMemory(data[data_size - 1], cap, size)) {
- free_data(data, data_size);
- return 1;
- }
- data[data_size - 1][size++] = '\0';
- }
- return 0;
- }
- int main() {
- size_t capasity = 1000;
- char** data = (char**)calloc(capasity, sizeof(char *));
- if (data == NULL) {
- perror("Bad alloc");
- free(data);
- return 1;
- }
- int data_size = 0;
- int size = 0; // size of current word
- int cap; // capasity of memory, that alloc for current word
- int c; // current char
- int prev_c = ' '; // previous char
- int quote = 0; // take the following values: 0, '\'', '\"'
- while ((c = getchar()) != EOF) {
- if (c == '\'' || c == '\"') {
- if (quote == 0) {
- quote = c;
- continue;
- }
- else if (quote == c) {
- quote = 0;
- continue;
- }
- }
- if (((c == '&' && peekchar() == '&') || (c == '|' && peekchar() == '|')) && quote == 0) {
- if (AddZero(data, data_size, size, &cap)) {
- return 1;
- }
- data[data_size++] = (char*)malloc(3 * sizeof(char));
- if (IsBadData(data[data_size - 1])) {
- free_data(data, data_size);
- return 1;
- }
- data[data_size - 1][0] = c;
- data[data_size - 1][1] = c;
- getchar();
- c = ' ';
- }
- else if ((c == ';' || c == '&' || c == '|') && quote == 0) {
- if (AddZero(data, data_size, size, &cap)) {
- return 1;
- }
- data[data_size++] = (char*)malloc(2 * sizeof(char));
- if (IsBadData(data[data_size - 1])) {
- free_data(data, data_size);
- return 1;
- }
- data[data_size - 1][0] = c;
- c = ' ';
- }
- else if (isspace(prev_c) && (!isspace(c) || quote != 0)) {
- if (AddZero(data, data_size, size, &cap)) {
- return 1;
- }
- data[data_size++] = (char*)malloc(sizeof(char));
- if (IsBadData(data[data_size - 1])) {
- free_data(data, data_size);
- return 1;
- }
- cap = 1;
- size = 0;
- data[data_size - 1][size++] = c;
- }
- else if (!isspace(prev_c) && (!isspace(c) || quote != 0)) {
- if (AddMemory(data[data_size - 1], &cap, size)) {
- free_data(data, data_size);
- return 1;
- }
- data[data_size - 1][size++] = c;
- }
- if (quote == 0) {
- prev_c = c;
- }
- else {
- prev_c = 'a';
- }
- }
- if (AddZero(data, data_size, size, &cap)) {
- return 1;
- }
- if (quote != 0) {
- perror("Incorrect input");
- free_data(data, data_size);
- return 1;
- }
- qsort(data, data_size, sizeof(char*), CmpStrings);
- for (int i = 0; i < data_size; ++i) {
- printf("\"%s\" \n", data[i]);
- }
- free_data(data, data_size);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement