amiga-e/ec33a_src/ec33a_src/extra/tools/Pragma2Module.e

107 lines
3.2 KiB
Plaintext

/* Pragma2Module
convert a SAS/C library pragma file to an E module.
Usage: p2m <file>
converts <file.h> to <file.m> */
ENUM INPUT_ERROR=10,OUTPUT_ERROR,FORMAT_ERROR
DEF cfh,efh,eof,
gotbase=FALSE,
offset=30,
cfile[200]:STRING,
efile[200]:STRING,
cstring[200]:STRING
PROC main()
StrCopy(cfile,arg,ALL)
StrAdd(cfile,'.h',ALL)
StrCopy(efile,arg,ALL)
StrAdd(efile,'.m',ALL)
WriteF('Amiga E Pragma2Module by $#%! in 1992\nconverting: "\s"\n',cfile)
IF (cfh:=Open(cfile,OLDFILE))=0 THEN closeall(INPUT_ERROR)
IF (efh:=Open(efile,NEWFILE))=0 THEN closeall(OUTPUT_ERROR)
REPEAT
eof:=ReadStr(cfh,cstring)
convert(cstring)
UNTIL eof
Write(efh,[$FF,0,0,0]:CHAR,4)
WriteF('last offset: -\d\n',offset)
WriteF('Done.\n')
closeall(0)
ENDPROC
PROC closeall(er)
IF cfh<>0 THEN Close(cfh)
IF efh<>0 THEN Close(efh)
SELECT er
CASE INPUT_ERROR; WriteF('Could not open input file!\n')
CASE OUTPUT_ERROR; WriteF('Could not open output file!\n')
CASE FORMAT_ERROR; WriteF('Pragma file format error!\n')
ENDSELECT
CleanUp(er)
ENDPROC
/* format of line to convert:
#pragma libcall <lib>Base <funcname> <hexoffset> <regsused> */
PROC convert(str)
DEF pos,pos2,off2,len,narg,a,empty,dstr[50]:STRING,basestr[50]:STRING
DEF funcstr[50]:STRING,regstr[20]:STRING
IF StrCmp(str,'#pragma libcall ',STRLEN) /* just those lines */
pos:=STRLEN
pos2:=InStr(str,' ',pos) /* find base */
IF pos2=-1 THEN closeall(FORMAT_ERROR)
IF gotbase=FALSE /* get base */
gotbase:=TRUE
MidStr(basestr,str,pos,pos2-pos)
LowerStr(basestr)
WriteF('Base will be: \s\n',basestr)
Write(efh,["EM","OD",6]:INT,6)
Out(efh,0)
Write(efh,basestr,EstrLen(basestr)+1)
ENDIF
pos:=pos2+1
pos2:=InStr(str,' ',pos) /* find func */
IF pos2=-1 THEN closeall(FORMAT_ERROR)
MidStr(funcstr,str,pos,pos2-pos)
IF (funcstr[0]>="a") AND (funcstr[0]<="z") THEN funcstr[0]:=funcstr[0]-32 /* Func, not fUnc */
IF (funcstr[1]>="A") AND (funcstr[1]<="Z") THEN funcstr[1]:=funcstr[1]+32
str[pos2]:="$"
UpperStr(str+pos2)
off2:=Val(str+pos2,NIL) /* get offset */
IF off2=0 THEN closeall(FORMAT_ERROR)
empty:=0
WHILE off2<>offset
Out(efh,16) /* "empty function slots" */
offset:=offset+6
INC empty
IF offset>off2 THEN closeall(FORMAT_ERROR)
ENDWHILE
IF empty>0 THEN WriteF('found \d empty or private functions before -\d.\n',empty,offset)
pos2:=InStr(str,' ',pos2+1) /* find offset/regs */
IF pos2=-1 THEN closeall(FORMAT_ERROR)
pos:=pos2+1
MidStr(dstr,str,pos,ALL)
Write(efh,funcstr,EstrLen(funcstr))
len:=EstrLen(dstr)
narg:=Val(dstr+len-1,NIL)
IF len>2
IF len-2<narg THEN StrCopy(regstr,'0',ALL)
StrAdd(regstr,dstr,len-2)
ELSE
StrCopy(regstr,'',ALL)
ENDIF
len:=EstrLen(regstr)
StrCopy(dstr,'$ ',ALL)
IF len>0
FOR a:=1 TO len
dstr[1]:=regstr[len-a]
Out(efh,Val(dstr,NIL))
ENDFOR
ELSE
IF narg=0 THEN Out(efh,16) ELSE Out(efh,0)
ENDIF
offset:=offset+6
ENDIF
ENDPROC