home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
zip
/
utility
/
wnx1091.lzh
/
BIN2C.C
next >
Wrap
C/C++ Source or Header
|
1991-10-20
|
12KB
|
568 lines
/*********************************************************************/
/* SAMPLE .WNX APPLICATION SKELETON */
/* portions borrowed from: */
/* started 5/28/85 R.Z. Copyright ATARI Corp. 1985 */
/*********************************************************************/
/*********************************************************************/
/* INCLUDE FILES */
/*********************************************************************/
#include <stdio.h>
#include <obdefs.h>
#include <gemdefs.h>
#include <osbind.h>
#include <xesblk.h>
#include <xesdefs.h>
/*********************************************************************/
/* DEFINES */
/*********************************************************************/
#define TRUE 1
#define FALSE 0
#define ACCNAME " File Converter "
#define WI_KIND (SIZER|MOVER|FULLER|CLOSER|NAME)
#define NO_WINDOW (-1)
#define MIN_WIDTH (2*gl_wbox)
#define MIN_HEIGHT (3*gl_hbox)
/*********************************************************************/
/* EXTERNALS */
/*********************************************************************/
extern int gl_apid,_app,errno;
extern long base,stksize,stack;
extern struct __c {
int *cb_pcontrol;
int *cb_pglobal;
int *cb_pintin;
int *cb_pintout;
long *cb_padrin;
long *cb_padrout;
} _c, *_ad_c;
extern int control[], global[];
extern int_in[], int_out[];
extern long addr_in[], addr_out[];
/*********************************************************************/
/* GLOBAL VARIABLES */
/*********************************************************************/
long oldstack;
int gl_hchar;
int gl_wchar;
int gl_wbox;
int gl_hbox; /* system sizes */
int phys_handle; /* physical workstation handle */
int handle; /* virtual workstation handle */
int wi_handle; /* window handle */
int top_window; /* handle of topped window */
int xdesk,ydesk,hdesk,wdesk;
int xold,yold,hold,wold;
int xwork,ywork,hwork,wwork; /* desktop and work areas */
int msgbuff[8]; /* event message buffer */
int keycode; /* keycode returned by event-keyboard */
int mx,my; /* mouse x and y pos. */
int butdown; /* button state tested for, UP/DOWN */
int ret; /* dummy return variable */
int hidden; /* current state of cursor */
int fulled; /* current state of window */
int contrl[12];
int intin[128];
int ptsin[128];
int intout[128];
int ptsout[128]; /* storage wasted for idiotic bindings */
int work_in[11]; /* Input to GSX parameter array */
int work_out[57]; /* Output from GSX parameter array */
int pxyarray[10]; /* input point array */
int menu_id;
xesparmblk xparmblk;
int current_type=0; /* Defaults to C code */
OBJECT *treeptr;
typedef struct{
char dta_res[21];
char dta_attrib[1];
int dta_time[1];
int dta_date[1];
long dta_size[1];
char dta_name[14];
}newdta;
#include "D:\\WNX_DEV\\WERCS\\CONVERT.H"
#include "D:\\WNX_DEV\\WERCS\\CONVERT.C"
void wnx_button()
{
/* Finds out what was clicked on and does what's necessary */
xes_xformdo(-1,treeptr,xparmblk.WNX_out[5],&xparmblk);
switch(xparmblk.WNX_out[5]){
case _C: {
current_type=0;
break;
}
case _devpac: {
current_type=1;
break;
}
case _list: {
current_type=2;
break;
}
case convertit: {
program();
treeptr[convertit].ob_state &= ~SELECTED;
xes_draw(convertit,1,&xparmblk);
break;
}
}
}
open_vwork()
{
int i;
for(i=0;i<10;work_in[i++]=1);
work_in[10]=2;
handle=phys_handle;
v_opnvwk(work_in,&handle,work_out);
}
void prg_acc_startup()
{
appl_init();
phys_handle=graf_handle(&gl_wchar,&gl_hchar,&gl_wbox,&gl_hbox);
open_vwork();
}
multi()
{
int event;
while (TRUE) {
/* currently only messages... could change this to an
evnt_mesag call, but I like to keep it open... */
event = evnt_multi(MU_MESAG,
1,1,1,
0,0,0,0,0,
0,0,0,0,0,
msgbuff,0,0,&mx,&my,&ret,&ret,&keycode,&ret);
switch(msgbuff[0]){
case AC_OPEN:
program();
break;
}
}
}
fix_path_name(p_ptr,n_ptr,f_ptr)
register char *p_ptr,*n_ptr,*f_ptr;
{
while (*p_ptr)
{
*f_ptr=*p_ptr;
++f_ptr;
++p_ptr;
}
while (*f_ptr!='\\')
--f_ptr;
++f_ptr;
while (*n_ptr)
{
*f_ptr=*n_ptr;
++n_ptr;
++f_ptr;
}
*f_ptr=0;
}
stopme()
{
if (_app==-1){
xparmblk.WNX_tcount=10;
xes_submit(&xparmblk);
}
}
uc2str(in,begin1)
unsigned char *in,begin1[];
{
int i;
unsigned char c[4];
sprintf(c,"%d",*in);
strcat(begin1,c);
}
convert2C(f_name,name,size)
char *f_name;
char *name[14];
long size;
{
char *in;
char filename[144],arrayname[11];
if (in=(char *)Malloc(size)){
/* Do the conversion here */
int i,j,inhandle,outhandle;
long temp1,temp2,fseekptr=0;
char begin1[80],begin2[80],begin3[80],begin4[80];
inhandle = Fopen(f_name,0);
if (inhandle<0)
return FALSE;
temp1 = Fread(inhandle,size,in);
if (temp1!=size) return FALSE;
Fclose(inhandle);
strcpy(filename,f_name);
i=0;
while (filename[i])
i++;
while (filename[i]!='\\')
i--;
while (filename[i]!='.' & filename[i]!=0)
i++;
if (filename[i+1]!='C' & (current_type==0)){
filename[i+1]='C';
filename[i+2]=0;
}
else if(filename[i+1]!='S' & (current_type==1)){
filename[i+1]='S';
filename[i+2]=0;
}
else{
filename[i+1]='O';
filename[i+2]='O';
filename[i+3]='P';
filename[i+4]=0;
}
outhandle = Fcreate(filename,0);
if (outhandle<0)
return FALSE;
/* fix the array name up... */
strcpy(arrayname,name);
i=0;
while (arrayname[i]!='.' & arrayname[i]!=0)
i++;
arrayname[i]=0;
switch (current_type){
case 0:{
/* C Declaration */
strcpy(begin1,"/* This is a C code representation of the file:\n");
strcpy(begin2," ");
strcat(begin2,f_name);
strcat(begin2,"\n");
strcpy(begin3," ...as an array of unsigned character (bytes) */\n\n");
strcpy(begin4,"unsigned char ");
strcat(begin4,arrayname);
strcat(begin4,"[] = {");
break;
}
case 1:{
/* Assembler (DevPac ST) */
strcpy(begin1,"; This is an assembler representation of the file:\n");
strcpy(begin2,"; ");
strcat(begin2,f_name);
strcat(begin2,"\n");
strcpy(begin3,"; ...as an array of bytes.\n\n");
strcpy(begin4,arrayname);
strcat(begin4,":");
break;
}
case 3:{
begin1[0]=0;
begin2[0]=0;
begin3[0]=0;
begin4[0]=0;
break;
}
}
temp2=(long)strlen(begin1);
if (temp2!=(Fwrite(outhandle,temp2,begin1)))
return FALSE;
Fclose(outhandle);
fseekptr += temp2;
outhandle = Fopen(filename,2);
if (outhandle<0) return FALSE;
temp2=(long)strlen(begin2);
Fseek(fseekptr,outhandle,0);
Fwrite(outhandle,temp2,begin2);
Fclose(outhandle);
fseekptr += temp2;
outhandle = Fopen(filename,2);
if (outhandle<0) return FALSE;
temp2=(long)strlen(begin3);
Fseek(fseekptr,outhandle,0);
Fwrite(outhandle,temp2,begin3);
Fclose(outhandle);
fseekptr += temp2;
outhandle = Fopen(filename,2);
if (outhandle<0) return FALSE;
temp2=(long)strlen(begin4);
Fseek(fseekptr,outhandle,0);
Fwrite(outhandle,temp2,begin4);
Fclose(outhandle);
fseekptr += temp2;
j=0;
for(i=0;i<size;i++){
/* Every 18 entries, skip to a new line... */
if ((i%18)==0){
if(i){
outhandle = Fopen(filename,2);
if (outhandle<0) return FALSE;
temp2=(long)strlen(begin1);
Fseek(fseekptr,outhandle,0);
Fwrite(outhandle,temp2,begin1);
Fclose(outhandle);
fseekptr += temp2;
stopme();
}
switch(current_type){
case 0:{
strcpy(begin1,"\n\t");
uc2str(in,begin1);
break;
}
case 1:{
strcpy(begin1,"\n\tdc.b ");
uc2str(in,begin1);
break;
}
case 2:{
strcpy(begin1,"\n\t");
uc2str(in,begin1);
break;
}
}
stopme();
}
else{
uc2str(in,begin1);
}
if (i<size-1){
switch(current_type){
case 0:{
strcat(begin1,",");
break;
}
default:{
if (i%18!=17)
strcat(begin1,",");
break;
}
}
}
++in;
}
/* End declaration */
outhandle = Fopen(filename,2);
if (outhandle<0) return FALSE;
temp2=(long)strlen(begin1);
Fseek(fseekptr,outhandle,0);
Fwrite(outhandle,temp2,begin1);
Fclose(outhandle);
fseekptr += temp2;
if (current_type==0){
strcpy(begin1,"\n};");
outhandle = Fopen(filename,2);
if (outhandle<0) return FALSE;
temp2=(long)strlen(begin1);
Fseek(fseekptr,outhandle,0);
Fwrite(outhandle,temp2,begin1);
Fclose(outhandle);
fseekptr += temp2;
}
return TRUE;
}
else return FALSE;
}
program()
{
int button;
static unsigned char drive;
static char path[128],name[14];
char fullname[144];
long size;
newdta *dta_ptr;
/* code for program's "guts" goes here... this is only called if
we're an .ACC or .PRG. A .WNX has to call this itself. */
if (!path[0]){
/* path has not been set before... */
strcpy(path,"A:\\");
drive = Dgetdrv();
path[0]+=drive;
Dgetpath(&path[3],drive+1);
strcat(path,"\\*.*");
}
button = TRUE;
/* loops until the user doesn't pick a file */
while(button){
/* pop goes the fsel cuz the fsel goes pop! */
fsel_input(path,name,&button);
if (button){
fix_path_name(path,name,fullname);
dta_ptr=(newdta *)Fgetdta();
if (!Fsfirst(fullname,3)){
size = *(dta_ptr->dta_size);
xparmblk.WNX_flags=XES_LINK|XES_TIMER;
convert2C(fullname,name,size);
xparmblk.WNX_flags=XES_BUTTON;
/* If not a program, don't keep looping like this */
if (_app!=1)
button = FALSE;
}
}
}
}
/****************************************************************/
/* Accessory Init. Until First Event_Multi */
/****************************************************************/
main()
{
switch(_app)
{
case -1:
{
/* WNX */
strcpy(xparmblk.WNX_idname,"File Converter");
xes_init(&xparmblk);
/* A .WNX doesn't have the variable __c, which is
its AES parameter block, fixed up during an
appl_init, so I have to do it myself. */
_c.cb_pcontrol=control;
_c.cb_pglobal=global;
_c.cb_pintin=int_in;
_c.cb_pintout=int_out;
_c.cb_padrin=addr_in;
_c.cb_padrout=addr_out;
_ad_c=&_c;
xes_genv(&xparmblk);
xes_pwindow(&xparmblk);
xes_rsrcinit(-1,2,CONVERT,&xparmblk);
treeptr=*(OBJECT **)&xparmblk.WNX_out[1];
treeptr[_C].ob_state = SELECTED;
phys_handle=xparmblk.WNX_grafhandle;
xparmblk.WNX_flags=XES_BUTTON; /* button events only */
xparmblk.WNX_broutine=wnx_button;
xes_submit(&xparmblk);
break;
}
#ifdef LASERC
default:
{
_app=1;
prg_acc_startup();
program();
}
#else
case 1:
{
/* PROGRAM */
prg_acc_startup();
program();
break;
}
case 0:
{
/* ACCESSORY */
prg_acc_startup();
menu_id=menu_register(gl_apid,ACCNAME);
multi();
break;
}
#endif
}
}