| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2017-01-20 22:19:09 +0100 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2017-01-20 22:19:09 +0100 | 
| commit | df3657b2a99ef20da99ac3c6c02f43cc23e70fca (patch) | |
| tree | 86a9e72bbbbaf7296b2d7cd2725a8bc42611a1f3 /src/tool/strings.c | |
| parent | 0d49fb74eadcf933f696420cd182077927680d26 (diff) | |
Moving towards a server/clients structure.
Diffstat (limited to 'src/tool/strings.c')
| -rw-r--r-- | src/tool/strings.c | 300 | 
1 files changed, 0 insertions, 300 deletions
| diff --git a/src/tool/strings.c b/src/tool/strings.c deleted file mode 100644 index 73a5cdd..0000000 --- a/src/tool/strings.c +++ /dev/null @@ -1,300 +0,0 @@ -#define _POSIX_C_SOURCE 200809L -#include <stdlib.h> -#include <string.h> -#include <stdint.h> /* defines SIZE_MAX */ - -#include "../io/error.h" - -#include "strings.h" - - -void ZoO_strings_initialize (struct ZoO_strings s [const restrict static 1]) -{ -   s->words_count = 0; -   s->words = (ZoO_char **) NULL; -   s->word_sizes = (size_t *) NULL; -} - -void ZoO_strings_finalize (struct ZoO_strings s [const restrict static 1]) -{ -   if (s->words_count != 0) -   { -      ZoO_index i; - -      for (i = 0; i < s->words_count; ++i) -      { -         free((void *) s->words[i]); -      } - -      s->words_count = 0; - -      free((void *) s->words); -      free((void *) s->word_sizes); - -      s->words = (ZoO_char **) NULL; -      s->word_sizes = (size_t *) NULL; -   } -} - -static int add_word -( -   struct ZoO_strings s [const restrict static 1], -   size_t const line_size, -   const ZoO_char line [const restrict static line_size] -) -{ -   size_t * new_s_word_sizes; -   ZoO_char * new_word, ** new_s_words; - -   if (s->words_count == ZoO_INDEX_MAX) -   { -      ZoO_S_WARNING("Data input sentence has too many words."); - -      return -1; -   } - -   /* overflow-safe, as line_size < SIZE_MAX */ -   new_word = (ZoO_char *) calloc((line_size + 1), sizeof(ZoO_char)); - -   if (new_word == (ZoO_char *) NULL) -   { -      ZoO_S_WARNING("Unable to allocate memory to extract new word."); - -      return -1; -   } - -   memcpy((void *) new_word, (const void *) line, line_size); - -   new_word[line_size] = '\0'; - -   new_s_words = -      (ZoO_char **) realloc -      ( -         (void *) s->words, -         /* XXX: (sizeof() * _) assumed overflow-safe. */ -         /* (di->words_count + 1) overflow-safe */ -         (sizeof(ZoO_char *) * (s->words_count + 1)) -      ); - -   if (new_s_words == (ZoO_char **) NULL) -   { -      ZoO_S_WARNING("Unable to reallocate memory to extract new word."); - -      free((void *) new_word); - -      return -1; -   } - -   s->words = new_s_words; - -   new_s_word_sizes = -      (size_t *) realloc -      ( -         (void *) s->word_sizes, -         /* XXX: (sizeof() * _) assumed overflow-safe. */ -         /* (di->words_count + 1) overflow-safe */ -         (sizeof(size_t) * (s->words_count + 1)) -      ); - -   if (new_s_word_sizes == (size_t *) NULL) -   { -      ZoO_S_WARNING("Unable to reallocate memory to extract new word."); - -      free((void *) new_word); - -      return -1; -   } - -   s->word_sizes = new_s_word_sizes; - -   s->words[s->words_count] = new_word; -   s->word_sizes[s->words_count] = (line_size + 1); - -   s->words_count += 1; - -   return 0; -} - -static int parse_word -( -   struct ZoO_strings s [const restrict static 1], -   ZoO_index const punctuations_count, -   const ZoO_char punctuations [const restrict static punctuations_count], -   size_t const line_size, -   ZoO_char line [const static line_size] -) -{ -   ZoO_index j; - -   if (line_size == 0) -   { -      return 0; -   } - -   for (j = 0; j < line_size; ++j) -   { -      switch (line[j]) -      { -         case 'A': -         case 'B': -         case 'C': -         case 'D': -         case 'E': -         case 'F': -         case 'G': -         case 'H': -         case 'I': -         case 'J': -         case 'K': -         case 'L': -         case 'M': -         case 'N': -         case 'O': -         case 'P': -         case 'Q': -         case 'R': -         case 'S': -         case 'T': -         case 'U': -         case 'V': -         case 'W': -         case 'X': -         case 'Y': -         case 'Z': -            line[j] = 'z' - ('Z' - line[j]); -            break; - -         default: -            break; -      } -   } - -   for (j = 0; j < punctuations_count; ++j) -   { -      /* overflow-safe: line_size > 1 */ -      if (line[line_size - 1] == punctuations[j]) -      { -         if (line_size > 1) -         { -            if -            ( -               /* overflow-safe: line_size > 1 */ -               (add_word(s, (line_size - 1), line) < 0) -               /* overflow-safe: line_size > 1 */ -               /* prevents line[restrict] */ -               || (add_word(s, 1, (line + (line_size - 1))) < 0) -            ) -            { -               return -1; -            } - -            return 0; -         } -      } -   } - -   return add_word(s, line_size, line); -} - -int ZoO_strings_parse -( -   struct ZoO_strings s [const restrict static 1], -   size_t input_size, -   ZoO_char input [const restrict], -   ZoO_index const punctuations_count, -   const ZoO_char punctuations [const restrict static punctuations_count] -) -{ -   size_t i, w_start; - -   ZoO_strings_finalize(s); - -   if (input == NULL) -   { -      return 0; -   } - -   i = 0; - -   /* overflow-safe: input is '\0' terminated. */ -   while (input[i] == ' ') -   { -      ++i; -   } - -   w_start = i; - -   if (input[i] == '\001') -   { -      /* This is an CTCP command. */ -      /* We'll remove the trailing '\001' so that only the first word */ -      /* indicates the need for CTCP (uppercase) syntax. */ - -      if ((input_size >= 1) && (input[input_size - 1] == '\001')) -      { -         input[input_size - 1] = ' '; -      } -      else -      { -         ZoO_WARNING -         ( -            "CTCP sequence '%s' did not end with a \\001 character.", -            input -         ); -      } -   } - -   for (; i < input_size; ++i) -   { -      if (input[i] == ' ') -      { -         if -         ( -            parse_word -            ( -               s, -               punctuations_count, -               punctuations, -               /* overflow-safe: w_start < i */ -               (i - w_start), -               (input + w_start) -            ) < 0 -         ) -         { -            ZoO_strings_finalize(s); - -            return -1; -         } - -         ++i; - -         /* safe, as input is terminated by '\0' */ -         while (input[i] == ' ') -         { -            ++i; -         } - -         w_start = i; -      } -   } - -   if -   ( -      parse_word -      ( -         s, -         punctuations_count, -         punctuations, -         /* overflow-safe: w_start =< i */ -         (i - w_start), -         (input + w_start) -      ) < 0 -   ) -   { -      ZoO_strings_finalize(s); - -      return -1; -   } - -   return 0; -} | 


