// cwrap.cpp
//
// A utility for wrapping arbitrary file data in C-compaibile source
// statements.
//
// (C) Copyright 2003,2016 Fred Gleason <fredg@paravelsystems.com>
//
//   This program is free software; you can redistribute it and/or modify
//   it under the terms of the GNU General Public License version 2 as
//   published by the Free Software Foundation.
//
//   This program is distributed in the hope that it will be useful,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//   GNU General Public License for more details.
//
//   You should have received a copy of the GNU General Public
//   License along with this program; if not, write to the Free Software
//   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
//

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

#include <cwrap.h>

int main(int argc,char *argv[])
{
  int input_fd;
  FILE *output_desc;
  char *input_name;
  char output_name[256];
  char var_name[256];
  bool found;
  struct stat stat;
  char line[LINE_LENGTH];
  int n;
  int count=0;

  //
  // Build Defaults
  //
  sprintf(output_name,"%s.c",argv[argc-1]);

  //
  // Process Arguments
  //
  for(int i=1;i<argc;i++) {
    found=false;
    if((!strcmp(argv[i],"-o"))||(!strcmp(argv[i],"--output-file"))) {
      found=true;
      if(i<(argc-2)) {
	strcpy(output_name,argv[++i]);
      }
      else {
	printf(USAGE);
	exit(1);
      }
    }
    if(i==(argc-1)) {
      input_name=argv[i];
      found=true;
    }
    if(!found) {
      printf(USAGE);
      exit(1);
    }
  }

  //
  // Set Variable Name
  //
  for(unsigned j=0;j<strlen(output_name);j++) {
    if(output_name[j]!='.') {
      var_name[j]=output_name[j];
    }
    else {
      var_name[j]=0;
      j=strlen(output_name);
    }
  }
  
  //
  // Open Files
  //
  if((input_fd=open(input_name,O_RDONLY))<0) {
    perror("wrapdat");
    exit(1);
  }
  if((output_desc=fopen(output_name,"w"))==NULL) {
    perror("wrapdat");
    exit(1);
  }

  //
  // Get Size of Source File and Write Header
  //
  memset(&stat,0,sizeof(struct stat));
  if(fstat(input_fd,&stat)) {
    perror("wrapdat");
    exit(1);
  }
  fprintf(output_desc,"const unsigned char %s[%ld] = {\n",
	  var_name,stat.st_size+1);

  //
  // Write Body
  //
  for(int i=0;i<(stat.st_size/LINE_LENGTH+1);i++) {
    n=read(input_fd,line,LINE_LENGTH);
    for(int j=0;j<n;j++) {
      fprintf(output_desc,"%d,",0xFF&line[j]);
      count++;
    }
    if(n>0) {
      fprintf(output_desc,"\n");
    }
  }
  fprintf(output_desc,"0};\n");

  //
  // Finish Up
  //
  close(input_fd);
  fclose(output_desc);
  exit(0);
}