/*
   american fuzzy lop++ - a trivial program to test the build
   --------------------------------------------------------
   Originally written by Michal Zalewski
   Copyright 2014 Google Inc. All rights reserved.
   Copyright 2019-2024 AFLplusplus Project. All rights reserved.
   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:
     https://www.apache.org/licenses/LICENSE-2.0
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#ifdef TEST_SHARED_OBJECT
  #define main main_exported
#endif

int main(int argc, char **argv) {

  int   fd = 0, cnt;
  char  buff[8];
  char *buf = buff;

  // we support command line parameter and stdin
  if (argc == 2) {

    buf = argv[1];

  } else {

    if (argc >= 3 && strcmp(argv[1], "-f") == 0) {

      if ((fd = open(argv[2], O_RDONLY)) < 0) {

        fprintf(stderr, "Error: unable to open %s\n", argv[2]);
        exit(-1);

      }

    }

    if ((cnt = read(fd, buf, sizeof(buf) - 1)) < 1) {

      printf("Hum?\n");
      return 1;

    }

    buf[cnt] = 0;

  }

  if (getenv("AFL_DEBUG")) fprintf(stderr, "test-instr: %s\n", buf);

  // we support three input cases (plus a 4th if stdin is used but there is no
  // input)
  switch (buf[0]) {

    case '0':
      printf("Looks like a zero to me!\n");
      break;

    case '1':
      printf("Pretty sure that is a one!\n");
      break;

    default:
      printf("Neither one or zero? How quaint!\n");
      break;

  }

  return 0;

}

