/* Copyright 2021 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
      http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/


#include "config.h"
#include "syshead.h"
#include "misc.h"
#include "buffer.h"

#include "fuzz_randomizer.h"

int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
  fuzz_random_init(data,size);

  struct gc_arena gc;
  struct buffer *bufp;
  struct buffer buf, buf2;
  struct buffer_list *buflistp = NULL;
  ssize_t generic_ssizet, _size;
  char *tmp;
  char *tmp2;
  char match;

  gc = gc_new();
  bufp = NULL;

  int total_to_fuzz = fuzz_randomizer_get_int(1, 20);
  for (int i = 0; i < total_to_fuzz; i++) {
    if (bufp == NULL) {
      generic_ssizet = fuzz_randomizer_get_int(0, 1);
      if (generic_ssizet == 0) {
        _size = fuzz_randomizer_get_int(0, 100);
        buf = alloc_buf_gc(_size, &gc);
        bufp = &buf;
      } else {
        tmp = get_random_string();
        buf = string_alloc_buf(tmp, &gc);
        bufp = &buf;
        free(tmp);
        tmp = NULL;
      }
    } else {
#define NUM_TARGETS 32
      generic_ssizet = fuzz_randomizer_get_int(0, NUM_TARGETS);
      switch (generic_ssizet) {
      case 0:
        buf_clear(bufp);
        break;
      case 1:
        buf2 = clone_buf(bufp);
        free_buf(&buf2);
        break;
      case 2:
        buf_defined(bufp);
        break;
      case 3:
        buf_valid(bufp);
        break;
      case 4:
        buf_bptr(bufp);
        break;
      case 5:
        buf_len(bufp);
        break;
      case 6:
        buf_bend(bufp);
        break;
      case 7:
        buf_blast(bufp);
        break;
      case 8:
        buf_str(bufp);
        break;
      case 9:
        generic_ssizet = fuzz_randomizer_get_int(0, 255);
        buf_rmtail(bufp, (uint8_t)generic_ssizet);
        break;
      case 10:
        buf_chomp(bufp);
        break;
      case 11:
        tmp = get_random_string();
        skip_leading_whitespace(tmp);
        free(tmp);
        tmp = NULL;
        break;
      case 12:
        tmp = get_random_string();
        chomp(tmp);
        free(tmp);
        tmp = NULL;
        break;
      case 13:
        tmp = get_random_string();
        tmp2 = get_random_string();
        rm_trailing_chars(tmp, tmp2);
        free(tmp);
        free(tmp2);
        tmp = NULL;
        tmp2 = NULL;
        break;
      case 14:
        tmp = get_random_string();
        string_clear(tmp);
        free(tmp);
        tmp = NULL;
        break;
      case 15:
        tmp = get_random_string();
        buf_string_match_head_str(bufp, tmp);
        free(tmp);
        tmp = NULL;
        break;
      case 16:
        tmp = get_random_string();
        buf_string_compare_advance(bufp, tmp);
        free(tmp);
        tmp = NULL;
        break;
      case 17:
        generic_ssizet = fuzz_randomizer_get_int(0, 255);

        tmp = get_random_string();
        if (strlen(tmp) > 0) {
          buf_parse(bufp, (int)generic_ssizet, tmp, strlen(tmp));
        }

        free(tmp);
        tmp = NULL;
        break;
      case 18:
        tmp = get_random_string();
        string_mod(tmp, fuzz_randomizer_get_int(0, 12312),
                   fuzz_randomizer_get_int(0, 23141234),
                   (char)fuzz_randomizer_get_int(0, 255));

        free(tmp);
        tmp = NULL;
        break;
      case 19:
        tmp = get_random_string();
        match = (char)fuzz_randomizer_get_int(0, 255);
        if (match != 0) {
          string_replace_leading(tmp, match, (char)fuzz_randomizer_get_int(0, 255));
        }

        free(tmp);
        tmp = NULL;
        break;
      case 20:
        tmp = get_random_string();
        buf_write(bufp, tmp, strlen(tmp));

        free(tmp);
        tmp = NULL;
        break;
      case 21:
        tmp = get_random_string();

        buf_write_prepend(bufp, tmp, strlen(tmp));

        free(tmp);
        tmp = NULL;
        break;
      case 22:
        buf_write_u8(bufp, fuzz_randomizer_get_int(0, 255));
        break;
      case 23:
        buf_write_u16(bufp, fuzz_randomizer_get_int(0, 1024));
        break;
      case 24:
        buf_write_u32(bufp, fuzz_randomizer_get_int(0, 12312));
        break;
      case 25:
        tmp = get_random_string();
        buf_catrunc(bufp, tmp);
        free(tmp);
        tmp = NULL;
        break;
      case 26:
        convert_to_one_line(bufp);
        break;
      case 27:
        buf_advance(bufp, fuzz_randomizer_get_int(0, 25523));
        break;
      case 28:
        buf_prepend(bufp, fuzz_randomizer_get_int(0, 251235));
        break;
      case 29:
        buf_reverse_capacity(bufp);
        break;
      case 30:
        buf_forward_capacity_total(bufp);
        break;
      case 31:
        buf_forward_capacity(bufp);
        break;
      case 32:
        tmp = get_random_string();
        buf_puts(bufp, tmp);
        free(tmp);
        tmp = NULL;
        break;
      }
    }

    if (buflistp == NULL) {
      buflistp = buffer_list_new(fuzz_randomizer_get_int(0, 200));
    } else {
#define NUM_LIST_TARGETS 6
      generic_ssizet = fuzz_randomizer_get_int(0, NUM_LIST_TARGETS);
      switch (generic_ssizet) {
      case 0:
        buffer_list_free(buflistp);
        buflistp = NULL;
        break;
      case 1:
        buffer_list_defined(buflistp);
        break;
      case 2:
        tmp = get_random_string();
        if (strlen(tmp) < BUF_SIZE_MAX) {
          buffer_list_push(buflistp, tmp);
        }
        free(tmp);
        tmp = NULL;
        break;
      case 3:
        buffer_list_peek(buflistp);
        break;
      case 4:
        buffer_list_pop(buflistp);
        break;
      case 5:
        tmp = get_random_string();
        buffer_list_aggregate_separator(
            buflistp, fuzz_randomizer_get_int(0, 1024), tmp);

        free(tmp);
        tmp = NULL;
        break;
      case 6:
        buffer_list_aggregate(buflistp,
                              fuzz_randomizer_get_int(0, 1024));
        break;
      }
    }
  }

  // Cleanup
  buffer_list_free(buflistp);
  gc_free(&gc);

  fuzz_random_destroy();

  return 0;
}
