Fred Gleason ee77ff599b 2019-01-15 Fred Gleason <fredg@paravelsystems.com>
* Added a 'View Credits' button to the 'System Information' dialog
	in rdadmin(1).
2019-01-15 19:34:56 -05:00

134 lines
2.7 KiB
C++

// 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);
}