home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Exec 5 / CD_Magazyn_EXEC_nr_5.iso / Programy / Programowanie / AmigaE / powerd.lha / PowerD / source / fd2m.d < prev    next >
Encoding:
Text File  |  2000-10-04  |  5.3 KB  |  203 lines

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