home *** CD-ROM | disk | FTP | other *** search
- PROC main()
- DEF args:PTR TO LONG,ra,
- name[256]:STRING,dest[256]:STRING,
- src:PTR TO CHAR,l,f=NIL
- args:=['diskfont',NIL]:LONG
- IF ra:=ReadArgs('SOURCE/A,SASC/S',args,NIL)
- IF args[1]
- StringF(name,'\s_pragmas.h',args[0])
- ELSE
- StringF(name,'\s_lib.h',args[0])
- ENDIF
- StringF(dest,'\s.m',args[0])
- IF (l:=FileLength(name))>0
- IF src:=New(l)
- IF f:=Open(name,OLDFILE)
- Read(f,src,l)
- Close(f)
- ELSE
- PrintFault(IoErr(),'pr2m')
- ENDIF
- IF f
- IF f:=Open(dest,NEWFILE)
- IF args[1] THEN xConvertSASC(f,src,l) ELSE xConvert(f,src,l)
- VfPrintf(f,'\n',NIL)
- Close(f)
- ELSE
- PrintFault(IoErr(),'pr2m')
- ENDIF
- ENDIF
- Dispose(src)
- ENDIF
- ELSE
- PrintFault(IoErr(),'pr2m')
- ENDIF
- FreeArgs(ra)
- ELSE
- PrintFault(IoErr(),'pr2m')
- ENDIF
- ENDPROC
-
- PROC xConvert(f,src:PTR TO CHAR,l)
- DEF p=0,type,head=FALSE,name[256]:STRING,offset,i
- WHILE p<l
- WHILE src[p]<>"#"
- p++
- IF p>=l THEN RETURN
- IF CtrlC() THEN RETURN
- ENDWHILE
- IF StrCmp('#pragma',src+p,7)
- p:=xSkip(src,p+7,l)
- p:=xGetName(name,src,p,l)
- IF StrCmp('amicall',name)
- type:="AMIC"
- ELSEIF StrCmp('tagcall',name)
- type:="TAGC"
- ELSE
- PrintF('Only amicall and tagcall allowed (\s).\n',name)
- RETURN
- ENDIF
- IF type
- p:=xSkip(src,p,l)
- IF src[p]="("
- p:=xSkip(src,p+1,l)
- p:=xGetName(name,src,p,l)
- IF head=FALSE
- VfPrintf(f,'LIBRARY \s\n',[name])
- head:=TRUE
- ELSE
- VfPrintf(f,',\n',NIL)
- ENDIF
- ELSE
- PrintF('"(" expected.\n')
- RETURN
- ENDIF
-
- p:=xSkip(src,p,l)
- IF src[p]=","
- p:=xSkip(src,p+1,l)
- p:=xGetName(name,src,p,l)
- IF (name[0]="0") AND (name[1]="x")
- name[0]:=" "
- name[1]:="$"
- offset:=Val(name)
- ELSE
- PrintF('"0x" expected.\n')
- RETURN
- ENDIF
- ELSE
- PrintF('"," expected.\n')
- RETURN
- ENDIF
-
- p:=xSkip(src,p,l)
- IF src[p]=","
- p:=xSkip(src,p+1,l)
- p:=xGetName(name,src,p,l)
- VfPrintf(f,'\t\s',[name])
- i:=0
- WHILE src[p]<>")"
- name[i]:=src[p]
- IF p>=l THEN RETURN
- IF CtrlC() THEN RETURN
- i++
- p++
- ENDWHILE
- name[i]:="\0"
- VfPrintf(f,'\s',[name])
- IF type="AMIC"
- VfPrintf(f,')',NIL)
- ELSEIF type="TAGC"
- VfPrintf(f,':LIST OF TagItem)',NIL)
- ENDIF
- ELSE
- PrintF('"," expected.\n')
- RETURN
- ENDIF
-
- VfPrintf(f,'(d0)=-\d',[offset])
- ENDIF
- ELSE
- p++
- ENDIF
- IF CtrlC() THEN RETURN
- ENDWHILE
- ENDPROC
-
- PROC xConvertSASC(f,src:PTR TO CHAR,l)
- DEF p=0,type,head=FALSE,name[256]:STRING,offset,i,num[16]:STRING,n
- WHILE p<l
- WHILE src[p]<>"#"
- p++
- IF p>=l THEN RETURN
- IF CtrlC() THEN RETURN
- ENDWHILE
- IF StrCmp('#pragma',src+p,7)
- p:=xSkip(src,p+7,l)
- p:=xGetName(name,src,p,l)
- IF StrCmp('libcall',name)
- type:="LIBC"
- ELSEIF StrCmp('tagcall',name)
- type:="TAGC"
- ELSE
- PrintF('Only amicall and tagcall allowed (\s).\n',name)
- RETURN
- ENDIF
- IF type
- p:=xSkip(src,p,l) -> read base
- p:=xGetName(name,src,p,l)
- IF head=FALSE
- VfPrintf(f,'LIBRARY \s\n',[name])
- head:=TRUE
- ELSE
- VfPrintf(f,',\n',NIL)
- ENDIF
-
- p:=xSkip(src,p,l) -> read function name
- p:=xGetName(name,src,p,l)
- VfPrintf(f,'\t\s(',[name])
- IF name[StrLen(name)-1]="A" THEN type:="TAGL"
-
- p:=xSkip(src,p,l) -> read function offset
- p:=xGetName(name,src,p,l)
- StringF(num,'$\s',name)
- offset:=Val(num)
-
- p:=xSkip(src,p,l) -> read arguments
- p:=xGetName(name,src,p,l)
- i:=StrLen(name)-3
- WHILE i>=0
- n:=name[i]
- StringF(num,'$\c',n)
- n:=Val(num)
- IF (n>=0) AND (n<=7) THEN VfPrintf(f,'d\d',[n])
- IF (n>=8) AND (n<=15) THEN VfPrintf(f,'a\d',[n-8])
- i--
- IF CtrlC() THEN RETURN
- EXIT i<0
- VfPrintf(f,',',NIL)
- ENDWHILE
- IF type="LIBC"
- VfPrintf(f,')',NIL)
- ELSEIF type="TAGL"
- VfPrintf(f,':PTR TO TagItem)',NIL)
- ELSEIF type="TAGC"
- VfPrintf(f,':LIST OF TagItem)',NIL)
- ENDIF
-
- VfPrintf(f,'(d0)=-\d',[offset])
- ENDIF
- ELSE
- p++
- ENDIF
- IF CtrlC() THEN RETURN
- ENDWHILE
- ENDPROC
-
- PROC xSkip(src:PTR TO CHAR,p,l)
- WHILE (src[p]=" ") OR (src[p]="\t")
- p++
- IF p>=l THEN RETURN l
- IF CtrlC() THEN RETURN l
- ENDWHILE
- ENDPROC p
-
- PROC xGetName(dst:PTR TO CHAR,src:PTR TO CHAR,p,l)
- DEF i=0
- WHILE ((src[p]>="A") AND (src[p]<="Z")) OR ((src[p]>="a") AND (src[p]<="z")) OR ((src[p]>="0") AND (src[p]<="9")) OR (src[p]="_")
- dst[i]:=src[p]
- IF p>=l THEN RETURN l
- IF CtrlC() THEN RETURN l
- i++
- p++
- ENDWHILE
- dst[i]:="\0"
- ENDPROC p
-
- CHAR '\n\n$VER:pr2m v1.0 by MarK (30.9.1999)\0\n\n'
-