#include <stdlib.h>
#include <stdio.h>

#include "prtrans.h"

#if !defined(__MAIN_C__)
#define main	main_prsample
#endif

#ifndef DEFAULT_BUFFER_SIZE
#define DEFAULT_BUFFER_SIZE 65536
#endif

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

int main (int argc, char **argv) {
  FILE *file;
  unsigned long length, buffer_size = DEFAULT_BUFFER_SIZE;
  char **parameters = argv;
  char *buffer;
  baseaddr = portaddr[DEFAULT_PORT];

  while (*++parameters && **parameters == '-') { /* check for options */
    if (parameters[0][1] == '-') { /* "--" ends options */
      parameters++;
      break;
    }

    switch (parameters[0][1]) {
    case 'p':
      baseaddr = strtoul (*++parameters, NULL, 16);

      if (baseaddr > 3) {
        fprintf (stderr, "%s: The printer port number must be between 0 and 3.\n",
                         *argv);
        return 1;
      }

      baseaddr = portaddr[baseaddr];
      break;

    case 'b':
      buffer_size = strtoul (*++parameters, NULL, 10);
      break;

    case '?':
    case 'h':
    Usage:
      fprintf (stderr, "%s: Plays samples on the remote computer.\n\n", *argv);
      fprintf (stderr, "Usage: %s [options] [filename(s)]\n",
                       *argv);
      fprintf (stderr, "Options:\n\t"
                         "-p port\t"
                             "Specify the printer port (0 to 3)\nt"
                         "-b buffersize\t"
                             "Specify the sample buffer size in bytes.\n");
      return 1;

    default:
      fprintf (stderr, "%s: Illegal option `%s'.\n", *argv, *parameters);
      goto Usage;
    }
  }

  if (!(buffer = malloc (buffer_size))) {
    fprintf (stderr, "%s: Could not allocate the sample buffer.\n", *argv);
    return 3;
  }

  if (prinit ()) {
    fprintf (stderr, "%s: Could not get the I/O permissions.\n", *argv);
    return 4;
  }

  if (!*parameters) { /* no file name specified */
    file = stdin;
    goto transfer;
  }

  while (*parameters) {
    if (!(file = fopen(*parameters, "rb"))) {
      fprintf (stderr, "%s: Could not open the file `%s'.\n", *argv,
                       *parameters);
      return 5;
    }

transfer:
    while (!feof (file)) {
      length = fread (buffer, 1, buffer_size, file);
      send (buffer, length);
    }

    fclose (file);

    if (*parameters) parameters++;
  }

  prclose ();

  return 0;
}
