home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 22 / AACD 22.iso / AACD / Programming / powerd / source / fd2m.d < prev    next >
Encoding:
Text File  |  2001-04-01  |  6.2 KB  |  227 lines

  1. // history:
  2. // 1.0 initial release
  3. // 1.1 (1.4.01) improved source name recognition
  4.  
  5. MODULE    'exec/memory'
  6.  
  7. OPT    OSVERSION=37
  8.  
  9. ENUM    T_VOID,T_PTR_TO_CHAR,T_PTR_TO_TagItem
  10. ENUM    SOURCE,PRIVAT
  11.  
  12. PROC main()
  13.     DEF    myargs:PTR TO LONG,rdargs,dest[256]:STRING,src[256]:STRING,tmp[256]:STRING,f
  14.     DEF    vers='$VER: fd2m v1.1 by MarK (1.4.2001)'
  15.     myargs:=[NIL,NIL]
  16.     IF rdargs:=ReadArgs('SOURCE/A,PRIVATE/S',myargs,NIL)
  17.         IF StrCmp(myargs[SOURCE]+StrLen(myargs[SOURCE])-7,'_lib.fd')
  18.             StrCopy(tmp,myargs[SOURCE],StrLen(myargs[SOURCE])-7)
  19.             StrCopy(src,myargs[SOURCE])
  20.             StringF(dest,'\s.m',tmp)
  21.             Convert(src,dest,IF myargs[PRIVAT] THEN TRUE ELSE FALSE)
  22.         ELSEIF StrCmp(myargs[SOURCE]+StrLen(myargs[SOURCE])-3,'.fd')
  23.             StrCopy(tmp,myargs[SOURCE],StrLen(myargs[SOURCE])-3)
  24.             StrCopy(src,myargs[SOURCE])
  25.             StringF(dest,'\s.m',tmp)
  26.             Convert(src,dest,IF myargs[PRIVAT] THEN TRUE ELSE FALSE)
  27.         ELSE
  28.             StringF(src,'\s.fd',myargs[SOURCE])
  29.             IF f:=Open(src,OLDFILE)
  30.                 Close(f)
  31.                 StrCopy(tmp,myargs[SOURCE],StrLen(myargs[SOURCE])-4)
  32.                 StringF(dest,'\s.m',tmp)
  33.                 Convert(src,dest,IF myargs[PRIVAT] THEN TRUE ELSE FALSE)
  34.             ELSE
  35.                 StringF(src,'\s_lib.fd',myargs[SOURCE])
  36.                 IF f:=Open(src,OLDFILE)
  37.                     Close(f)
  38.                     StringF(dest,'\s.m',myargs[SOURCE])
  39.                     Convert(src,dest,IF myargs[PRIVAT] THEN TRUE ELSE FALSE)
  40.                 ELSE PrintFault(IOErr(),'fd2m')
  41.             ENDIF
  42.         ENDIF
  43.         FreeArgs(rdargs)
  44.     ELSE
  45.         PrintFault(IOErr(),'fd2m')
  46.     ENDIF
  47. ENDPROC
  48.  
  49. PROC Convert(src:PTR TO CHAR,dst:PTR TO CHAR,private)
  50.     DEF s,d,m,l
  51.     IF s:=Open(src,OLDFILE)
  52.         IF d:=Open(dst,NEWFILE)
  53.             IF m:=AllocVec(l:=FileLength(src),MEMF_PUBLIC|MEMF_CLEAR)
  54.                 Read(s,m,l)
  55.                 Process(d,m,l,private)
  56.                 FreeVec(m)
  57.             ENDIF
  58.             Close(d)
  59.         ELSE PrintFault(IOErr(),'fd2m')
  60.         Close(s)
  61.     ELSE PrintFault(IOErr(),'fd2m')
  62. ENDPROC
  63.  
  64. PROC Process(o,src:PTR TO CHAR,length,private)
  65.     DEF    pos=0,offset=30,public,name[256]:CHAR,l,next,nofirst
  66.     DEF    argtype[64]:CHAR,p,q,cpu="68k",usingcpu="68k"
  67.     WHILE pos<length
  68.         IF src[pos]="*"
  69.             pos:=NextLine(src,pos,length)
  70.         ELSEIF (src[pos]="#")&&(src[pos+1]="#")
  71. //            PrintF('##\d\n',pos)
  72.             pos:=pos+2
  73.             IF StrCmp(src+pos,'base',4)
  74.                 VFPrintF(o,'LIBRARY ',NIL)
  75.                 nofirst:=FALSE
  76.                 Flush(o)
  77.                 Write(o,src+pos+6,WordLength(src,pos+6,length))
  78.                 pos:=NextLine(src,pos,length)
  79.             ELSEIF StrCmp(src+pos,'bias',4)
  80.                 offset:=Val(src+pos+5)
  81.                 pos:=NextLine(src,pos,length)
  82.             ELSEIF StrCmp(src+pos,'public',6)
  83.                 public:=TRUE
  84.                 pos:=NextLine(src,pos,length)
  85.             ELSEIF StrCmp(src+pos,'private',7)
  86.                 public:=FALSE
  87.                 pos:=NextLine(src,pos,length)
  88.             ELSEIF StrCmp(src+pos,'shadow',6)
  89.                 offset-=6
  90.                 pos:=NextLine(src,pos,length)
  91.             ELSEIF StrCmp(src+pos,'abi',3)
  92.                 pos+=4
  93.                 WHILE src[pos]=" " OR src[pos]="\t" DO pos++
  94.                 IF StrCmp(src+pos,'M68k',4) OR StrCmp(src+pos,'M68K',4) OR StrCmp(src+pos,'m68k',4)
  95.                     cpu:="68k"
  96.                 ELSEIF StrCmp(src+pos,'PPC0',4) OR StrCmp(src+pos,'ppc0',4)
  97.                     cpu:="ppc0"
  98.                 ELSEIF StrCmp(src+pos,'PPC2',4) OR StrCmp(src+pos,'ppc2',4)
  99.                     cpu:="ppc2"
  100.                 ELSEIF StrCmp(src+pos,'PPC',3) OR StrCmp(src+pos,'ppc',3)
  101.                     cpu:="ppc"
  102.                 ENDIF
  103.                 pos:=NextLine(src,pos,length)
  104.             ELSEIF StrCmp(src+pos,'end',3)
  105.                 RETURN
  106.             ENDIF
  107.         ELSE
  108. //            WriteF('\d\n',pos)
  109.             IF public=TRUE OR (public=FALSE AND private=TRUE)
  110.                 IF cpu<>usingcpu
  111.                     IF nofirst THEN VFPrintF(o,',\n',NIL)
  112.                     SELECT cpu
  113.                     CASE "68k";    VFPrintF(o,'M68K',NIL)
  114.                     CASE "ppc";    VFPrintF(o,'PPC',NIL)
  115.                     CASE "ppc0";VFPrintF(o,'PPC0',NIL)
  116.                     CASE "ppc2";VFPrintF(o,'PPC2',NIL)
  117.                     ENDSELECT
  118.                     nofirst:=TRUE
  119.                     usingcpu:=cpu
  120.                 ENDIF
  121.  
  122.                 StrCopy(name,src+pos,l:=WordLength(src,pos,length))
  123.                 pos+=l
  124.                 pos++                                // skip "("
  125.                 IF nofirst THEN VFPrintF(o,',',NIL)
  126.                 nofirst:=TRUE
  127.                 VFPrintF(o,'\n\t\s(',[name])
  128.                 IF cpu="ppc" OR cpu="ppc0" OR cpu="ppc2"
  129.                     p:=0
  130.                     WHILE src[pos]<>")"
  131.                         name[p]:=src[pos]
  132.                         IF name[p]="/" THEN name[p]:=","
  133.                         pos++
  134.                         p++
  135.                     ENDWHILE
  136.                     name[p]:="\0"
  137.                     VFPrintF(o,'\s',[name])
  138.                 ELSE
  139.                     p:=0
  140.                     WHILE src[pos]<>")"
  141.                         argtype[p]:=T_VOID
  142.                         IF StrCmp(src+pos,'title',STRLEN)
  143.                             argtype[p]:=T_PTR_TO_CHAR
  144.                             q:=5
  145.                         ELSEIF StrCmp(src+pos,'name',STRLEN)
  146.                             argtype[p]:=T_PTR_TO_CHAR
  147.                             q:=4
  148.                         ELSEIF StrCmp(src+pos,'text',STRLEN)
  149.                             argtype[p]:=T_PTR_TO_CHAR
  150.                             q:=4
  151.                         ELSEIF StrCmp(src+pos,'tags',STRLEN)
  152.                             argtype[p]:=T_PTR_TO_TagItem
  153.                             q:=4
  154.                         ELSEIF StrCmp(src+pos,'args',STRLEN)
  155.                             argtype[p]:=T_PTR_TO_TagItem
  156.                             q:=4
  157.                         ELSEIF StrCmp(src+pos,'taglist',STRLEN)
  158.                             q:=7
  159.                             argtype[p]:=T_PTR_TO_TagItem
  160.                         ELSE
  161.                             REPEAT
  162.                                 pos++
  163.                             UNTIL (src[pos]=",")||(src[pos]=")")
  164.                             q:=0
  165.                         ENDIF
  166.                         pos:=pos+q
  167.                         IF src[pos]=","
  168.                             pos++                        // skip ","
  169.                         ENDIF
  170.                         p++
  171.                         IF CtrlC() THEN RETURN
  172.                     ENDWHILE
  173.                     pos++                                // skip ")"
  174.                     pos++                                // skip "("
  175.                     IF src[pos]<>")"
  176.                         next:=TRUE
  177.                         p:=0
  178.                         WHILE next
  179.                             IF (src[pos]="a")||(src[pos]="A") THEN VFPrintF(o,'a',NIL)
  180.                             IF (src[pos]="d")||(src[pos]="D") THEN VFPrintF(o,'d',NIL)
  181.                             IF ((src[pos]="f")||(src[pos]="F"))&&((src[pos]="p")||(src[pos]="P")) THEN VFPrintF(o,'fp',NIL)
  182.                             pos++
  183.                             IF (src[pos]>="0")&&(src[pos]<="7") THEN VFPrintF(o,'\d',[UByte(src+pos)-"0"])
  184.                             pos++
  185.                             SELECT argtype[p]
  186.                             CASE T_PTR_TO_CHAR;        VFPrintF(o,':PTR TO CHAR',NIL)
  187.                             CASE T_PTR_TO_TagItem;    VFPrintF(o,':PTR TO TagItem',NIL)
  188.                             ENDSELECT
  189.                             next:=IF (src[pos]=",")||(src[pos]="/") THEN TRUE ELSE FALSE
  190.                             IF next THEN VFPrintF(o,',',NIL)
  191.                             pos++
  192.                             p++
  193.                             IF CtrlC() THEN RETURN
  194. //                            WriteF('\d\n',pos)
  195.                         ENDWHILE
  196.                     ENDIF
  197.                 ENDIF
  198.                 IF cpu="68k" THEN VFPrintF(o,')(d0)=-\d',[offset]) ELSE VFPrintF(o,')(r3)=-\d',[offset])
  199.             ENDIF
  200.             offset+=6
  201.             pos:=NextLine(src,pos,length)
  202.         ENDIF
  203.         IF CtrlC() THEN RETURN
  204.     ENDWHILE
  205.     VFPrintF(o,'\n',NIL)
  206. ENDPROC
  207.  
  208. PROC NextLine(src:PTR TO CHAR,pos,length)(LONG)
  209.     WHILE src[pos]<>"\n"
  210.         pos++
  211.     EXITIF pos>length
  212.         IF CtrlC() THEN RETURN
  213.     ENDWHILE
  214. ENDPROC pos+1                                                        // skip "\n"
  215.  
  216. PROC WordLength(src:PTR TO CHAR,pos,length)(LONG)
  217.     DEF l=0
  218.     WHILE IsAlpha(src[pos])
  219.         l++
  220.         pos++
  221.     EXITIF pos>length
  222.         IF CtrlC() THEN RETURN
  223.     ENDWHILE
  224. ENDPROC l
  225.  
  226. PROC IsAlpha(c)(LONG) IS IF ((((c>="A")&&(c<="Z"))||((c>="a")&&(c<="z")))||((c>="0")&&(c<="9")))||(c="_") THEN TRUE ELSE FALSE
  227.