home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
zip
/
gnu
/
utlsrc33.lzh
/
UTLSRC33
/
PRG2OUT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-30
|
3KB
|
162 lines
/*
* prg2out - convert gemdos .prg to minix a.out
* info derived from
* minixcvt.c - thanks frans (meulenbr@cst.prl.philips.nl)
* and (re-hacked) relmix.c provided with minix St
* ++jrb (bammi@sargsun.ces.cwru.edu)
*/
#include "st-out.h"
extern long lseek();
struct aexec head;
char buff[16384];
int fi, fo;
char *progname;
char *chmemstr;
main(argc,argv)
int argc;
char *argv[];
{
register int part, n;
register long left;
progname = argv[0];
if (argc > 1)
switch (argv[1][0]) {
case '-':
case '+':
case '=':
chmemstr = argv[1];
argc--;
argv++;
}
if (argc != 3)
error('f', "Usage: %s [+-= amount] infile outfile", progname);
if ((fi = open(argv[1], 0)) < 0)
error('f',"Couldn't open %s for input",argv[1]);
if ((fo = creat(argv[2], 0666)) < 0)
error('f',"Couldn't open %s for output",argv[2]);
/*
* read header and copy to output
*/
if (read(fi, &head, sizeof(struct aexec)) != sizeof(struct aexec))
error('f', "read error (magic)");
if (head.a_magic != CMAGIC)
error('f', "bad magic %04x, must be %04x",
head.a_magic, CMAGIC);
if (head.a_isreloc != 0)
error('f', "no relocation info present");
/* write out minix head */
minixhead();
/*
* copy text+data
*/
left = head.a_text + head.a_data;
part = sizeof(buff);
while (left) {
n = left > part ? part : left;
if (read(fi, buff, n) != n)
error('f', "read error (text+data)");
if (write(fo, buff, n) != n)
error('f', "write error(text+data)");
left -= n;
}
/*
* skip symbols
*/
if (head.a_syms > 0)
if (lseek(fi, head.a_syms, 1) !=
(sizeof(struct aexec) + head.a_text + head.a_data + head.a_syms))
error('f', "seek error");
/*
* copy relocation info
*/
while((n = read(fi, buff, sizeof(buff))) > 0)
if(write(fo, buff, n) != n)
error('f',"write error(reloc)");
if(n != 0)
error('f', "read error(reloc)");
close(fi); close(fo);
}
minixhead()
{
long mh[8];
char mb[32];
long stack;
long chmem();
mh[0] = 0x04100301L;
mh[1] = 0x00000020L;
mh[2] = head.a_text;
mh[3] = head.a_data;
mh[4] = head.a_bss;
mh[5] = 0;
stack = 0x00010000L - (mh[3] + mh[4]);
if ((mh[0] & 0x00200000L) == 0) /* not SEPARATE */
stack -= mh[2];
while (stack < 0)
stack += 0x00010000L;
if (chmemstr)
stack = chmem(chmemstr, stack);
printf("%ld bytes assigned to stack+malloc area\n", stack);
mh[6] = stack + (mh[3] + mh[4]);
if ((mh[0] & 0x00200000L) == 0) /* not SEPARATE */
mh[6] += mh[2];
mh[7] = 0;
putstruc((char *)mh, "M44444444", mb);
if (write(fo, mb, sizeof(mb)) != sizeof(mb))
error('f', "write error(head)");
}
long chmem(str, old)
char *str;
long old;
{
register long num, new;
long atol();
num = atol(str+1);
if (num == 0)
error('f', "bad chmem amount %s", str+1);
switch (str[0]) {
case '-':
new = old - num; break;
case '+':
new = old + num; break;
case '=':
new = num; break;
}
return(new);
}
/* VARARGS2 */
error(t,s,a,b,c,d,e,f,g,h,i,j)
char t;
char *s;
{
printf("%s: ",progname);
printf(s,a,b,c,d,e,f,g,h,i,j);
printf("\n");
switch (t) {
case 'w':
return;
case 'f':
exit(1);
case 'a':
abort();
default:
error('w',"Illegal error type: '%c'",t);
}
}
#include "putstruc.c"