#include 
#include 
#include 

#define BUFFER_SIZE 4096

int main(argCount, argVectorPtr)
  int argCount;
  char *argVectorPtr[];
{
  FILE *inputFile, *outputFile;
  float floatVariable;
  int scanfReturnCode, count, bigEndianMachine;
  char buffer[BUFFER_SIZE];
  char *inputFilename, *outputFilename;
  float testFloat;
  unsigned char *testPtr;

  printf("[asc2bin 0.3]  04/18/2000  B.J. Guillot  bguillot@acm.org\n");

  if (argCount != 3) {  /* two arguments required */
    printf("Syntax:   asc2bin inputfilename outputfilename\n\n");
    printf("'inputfilename' must be an ASCII text file containing ASCII\n");
    printf("representation of floating point numbers.  'outputfilename' will\n");
    printf("be created/overwritten and containg IEEE-754 single precision\n");
    printf("Big-Endian floating point format binary representation.\n");
    exit(1);
  }

  count = 0;
  inputFilename = argVectorPtr[1];
  outputFilename = argVectorPtr[2];

  testFloat = 1.0;
  testPtr = (unsigned char*)&testFloat;
  if ((testPtr[0] == 0) && (testPtr[1] == 0) && (testPtr[2] == 0x80)
        && (testPtr[3] == 0x3f)) {
    printf("Little endian machine detected.\n");
    bigEndianMachine = 0; /* detected a little-endian machine, PC */
  } else if ((testPtr[0] == 0x3f) && (testPtr[1] == 0x80)
        && (testPtr[2] == 0) && (testPtr[2] == 0)) {
    printf("Big endian machine detected.\n");
    bigEndianMachine = 1;  /* detected a big-endian machine, workstation */
  } else {
    printf("This machine does not apparently support IEEE-754 format!\n");
    exit(1);
  }

  printf("Input file: %s\n", inputFilename);
  inputFile = fopen(inputFilename, "rt");

  printf("Output file: %s\n", outputFilename);
  outputFile = fopen(outputFilename, "wb");

  do {

    scanfReturnCode = fscanf(inputFile, "%f", &floatVariable);
    if (scanfReturnCode == 1) {

      count++;
      testPtr = (unsigned char*)&floatVariable;

      if (bigEndianMachine) {
        fputc(testPtr[0], outputFile);
        fputc(testPtr[1], outputFile);
        fputc(testPtr[2], outputFile);
        fputc(testPtr[3], outputFile);
      } else { /* program running on Little-Endian machine */
        fputc(testPtr[3], outputFile);
        fputc(testPtr[2], outputFile);
        fputc(testPtr[1], outputFile);
        fputc(testPtr[0], outputFile);
      }

    } else if (scanfReturnCode == 0) {
        fscanf(inputFile, "%s", buffer);
        printf("WARNING: Cannot convert '%s' into float\n", buffer);
    }
  } while (scanfReturnCode != EOF);

  printf("%d elements successfully scanned and converted.\n", count);

  fclose(inputFile);
  fclose(outputFile);

  return(0);
}