home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 22 / AACD 22.iso / AACD / Programming / powerd / source / pc.d < prev    next >
Encoding:
Text File  |  2000-09-30  |  6.4 KB  |  249 lines

  1. /*
  2.     1) Nacist soubor #?.project (?)
  3.     2) Nacist jmeno vystupniho souboru
  4.     3) Nacist jmena linkovanych souboru, kontrola se zdrojovym kodem tykajici 
  5.         se data vytvoreni souboru, pripadne soubor zkompilovat
  6.     4) Nacist jmeno hlavicky
  7.     5) Nacist jmena linkovacich knihoven
  8.     6) Slinkovat
  9. */
  10. OPT    OPTIMIZE
  11.  
  12. MODULE    'dos/dos','exec/memory'
  13.  
  14. ENUM    FROM,AALL,DEBUGSYM,ASMINFO,RUN,NOWARN,DELFILES
  15. SET    F_ALL,
  16.         F_DEBUGSYM,
  17.         F_ASMINFO,
  18.         F_RUN,
  19.         F_NOWARN,
  20.         F_DELFILES
  21.  
  22. DEF    flags=0
  23.  
  24. PROC main()
  25.     DEF myargs:PTR TO LONG,rdargs,arglist[1536]:STRING,run[64]:STRING
  26.     myargs:=[0,0,0,0,0,0,0]
  27.     IF rdargs:=ReadArgs('FROM/A,A=ALL/S,DS=DEBUGSYM/S,AI=ASMINFO/S,R=RUN/S,NW=NOWARN/S,DF=DELFILES/S',myargs,NIL)
  28.         IF myargs[AALL]     THEN flags:=flags OR F_ALL
  29.         IF myargs[DEBUGSYM] THEN flags:=flags OR F_DEBUGSYM
  30.         IF myargs[ASMINFO]  THEN flags:=flags OR F_ASMINFO
  31.         IF myargs[RUN]      THEN flags:=flags OR F_RUN
  32.         IF myargs[NOWARN]   THEN flags:=flags OR F_NOWARN
  33.         IF myargs[DELFILES] THEN flags:=flags OR F_DELFILES
  34.         PrintF('\s: Reading...\b','\e[1mPowerD\e[0m Project Compiler v0.4')
  35.         IF ReadProject(myargs[FROM],arglist,run)
  36.             PrintF('\s: Linking...\b','\e[1mPowerD\e[0m Project Compiler v0.4')
  37.             Execute(arglist,NIL,NIL)
  38.             IF flags AND F_RUN
  39.                 PrintF('\s: Executing...\b','\e[1mPowerD\e[0m Project Compiler v0.4')
  40.                 Execute(run,NIL,NIL)
  41.             ENDIF
  42.             PrintF('\s: Done.       \n','\e[1mPowerD\e[0m Project Compiler v0.4')
  43.         ELSE
  44.             PrintF('\s: Not Done.   \n','\e[1mPowerD\e[0m Project Compiler v0.4')
  45.         ENDIF
  46.         FreeArgs(rdargs)
  47.     ELSE
  48.         PrintFault(IOErr(),'pc')
  49.     ENDIF
  50. ENDPROC
  51.  
  52. PROC ReadProject(filename:PTR TO CHAR,arglist:PTR TO CHAR,run:PTR TO CHAR)
  53.     DEF    l,k,src=NIL:PTR TO CHAR,f=NIL,pos,havehead=FALSE,haveexe=FALSE,have=FALSE,
  54.             name[16]:STRING,head[256]:STRING,exe[256]:STRING,str[256]:STRING,
  55.             data[1280]:STRING
  56.     StringF(str,'\s.dpr',filename)
  57.     IF (l:=FileLength(str))<=0 THEN Raise("FILE")
  58.     IFN src:=AllocVec(l+16,MEMF_PUBLIC|MEMF_CLEAR) THEN Raise("MEM")
  59.     IFN f:=Open(str,OLDFILE) THEN f:=Open(filename,OLDFILE)
  60.     IFN f THEN Raise("FILE")
  61.     k:=Read(f,src,l)
  62.     Close(f)
  63.     f:=NIL
  64.     IF k<>l THEN Raise("FILE")
  65.  
  66.     pos:=0
  67.     IF StrCmp(src,'PowerD Project v',STRLEN)=FALSE THEN Raise("ILLE")
  68.     pos+=STRLEN
  69.     IF src[pos]="2"
  70.         pos:=Skip(src,pos+1,l)
  71.  
  72.     ELSEIF src[pos]="1"
  73.         pos:=Skip(src,pos+1,l)
  74.  
  75.         WHILE pos<l
  76.             pos:=Skip(src,pos,l)
  77.         EXITIF src[pos]="\0" OR pos>=l
  78.             pos:=GetName(name,src,pos,l)
  79.             pos:=Skip(src,pos,l)
  80.             LowerStr(name)
  81.             IF src[pos]<>"=" THEN Raise("SNTX",pos)
  82.             pos:=Skip(src,pos+1,l)
  83.             pos:=GetString(str,src,pos,l)
  84.             SELECT TRUE
  85.             CASE StrCmp(name,'head'),StrCmp(name,'header'),StrCmp(name,'startup');    StrCopy(head,str);    havehead:=TRUE
  86.             CASE StrCmp(name,'exe'),StrCmp(name,'out'),StrCmp(name,'output');            StrCopy(exe,str);        haveexe:=TRUE
  87.             CASE StrCmp(name,'obj'),StrCmp(name,'lib'),StrCmp(name,'object')
  88.                 have:=TRUE
  89.                 StrAdd(data,'"')
  90.                 StrAdd(data,str)
  91.                 StrAdd(data,'" ')
  92.                 IFN StrCmp(name,'lib') THEN Test(str)
  93.             ENDSELECT
  94.             IF CtrlC() THEN Raise("^C")
  95.         ENDWHILE
  96.  
  97.         StrAdd(data,'"d:lib/powerd_fpu.lib" ')
  98.  
  99.         IF havehead=FALSE
  100.             StrCopy(head,'d:lib/startup.o')
  101.             havehead:=TRUE
  102.         ENDIF
  103.  
  104.         StrCopy(arglist,IF flags&F_DEBUGSYM THEN 'PhxLnk K1 NOSHORTRELOCS FROM ' ELSE 'PhxLnk NOSHORTRELOCS FROM ')
  105.         IF havehead
  106.             StrAdd(arglist,'"')
  107.             StrAdd(arglist,head)
  108.             StrAdd(arglist,'" ')
  109.         ENDIF
  110.         IF have
  111.             StrAdd(arglist,data)
  112.         ELSE Raise("OBJ")
  113.         IF haveexe
  114.             StrAdd(arglist,'to "')
  115.             StrAdd(arglist,exe)
  116.             StrAdd(arglist,'"')
  117.  
  118.             StrCopy(run,'"')
  119.             StrAdd(run,exe)
  120.             StrAdd(run,'"')
  121.         ELSE Raise("EXE")
  122.     ELSE Raise("NEW")
  123.  
  124. EXCEPT
  125.     SELECT exception
  126.     CASE "SNTX";    PrintF('\n%s: Syntax error on \d. byte\n','pc',exceptioninfo)
  127.     CASE "^C";        PrintF('\n%s: ***Break\n','pc')
  128.     CASE "EOF";        PrintF('\n%s: Unexpected end of file\n','pc')
  129.     CASE "FILE";    PrintFault(IOErr(),'pc')
  130.     CASE "MEM";        PrintF('\n%s: Not enough memory\n','pc')
  131.     CASE "ILLE";    PrintF('\n%s: Bad file\n','pc')
  132.     CASE "NEW";        PrintF('\n%s: Newer version requied\n','pc')
  133.     CASE "EXE";        PrintF('\n%s: EXE keyword not found\n','pc')
  134.     CASE "OBJ";        PrintF('\n%s: OBJ keyword not found\n','pc')
  135.     ENDSELECT
  136.     IF src THEN FreeVec(src)
  137.     IF f THEN Close(f)
  138.     RETURN FALSE
  139. ENDPROC TRUE
  140.  
  141. PROC Test(oname:PTR TO CHAR)
  142.     DEF    sname[256]:STRING,ofib:FileInfoBlock,f,sfib:FileInfoBlock
  143.     StrCopy(sname,oname,StrLen(oname)-1)
  144.     StrAdd(sname,'d')
  145.     IF flags AND F_ALL
  146.         Compile(oname,sname)
  147.     ELSE
  148.         IF f:=Open(sname,OLDFILE)
  149.             ExamineFH(f,sfib)
  150.             Close(f)
  151.             IF f:=Open(oname,OLDFILE)
  152.                 ExamineFH(f,ofib)
  153.                 Close(f)
  154.                 IF CompareDates(sfib.Date,ofib.Date)<0
  155.                     Compile(oname,sname)
  156.                 ENDIF
  157.             ELSE
  158.                 Compile(oname,sname)
  159.             ENDIF
  160.         ENDIF
  161.     ENDIF
  162.     PrintF('\e[1mPowerD\e[0m Project Compiler v0.4: Reading...\b')
  163. ENDPROC
  164.  
  165. PROC Compile(oname:PTR TO CHAR,sname:PTR TO CHAR)
  166.     DEF    exe[550]:STRING,f
  167.     PrintF('\s: Compiling: \s\n','\e[1mPowerD\e[0m Project Compiler v0.4',sname)
  168.     StringF(exe,'dc "\s" TOOBJECT "\s" <>NIL:',sname,oname)
  169.     IF flags AND F_DEBUGSYM THEN StrAdd(exe,' DS')
  170.     IF flags AND F_ASMINFO  THEN StrAdd(exe,' ASMINFO')
  171.     IF flags AND F_NOWARN   THEN StrAdd(exe,' NOWARN')
  172.     Execute(exe,NIL,NIL)
  173.     IF f:=Open('t:powerd.err.log',OLDFILE)
  174.         WHILE FGets(f,exe,548)
  175.             PrintF(exe)
  176.         ENDWHILE
  177.         Close(f)
  178.     ENDIF
  179. ENDPROC
  180.  
  181. PROC GetName(name:PTR TO CHAR,src:PTR TO CHAR,pos,length)
  182.     DEF i=0
  183.     IF IsAlpha(src[pos])
  184.         WHILE IsAlphaNum(src[pos])
  185.             name[i]:=src[pos]
  186.             pos++
  187.             i++
  188.             CtrlC()
  189.             IF pos>length THEN Raise("EOF",pos)
  190.         ENDWHILE
  191.         name[i]:="\0"
  192.     ENDIF
  193. ENDPROC pos,name
  194.  
  195. PROC GetString(str:PTR TO CHAR,src:PTR TO CHAR,pos,length)
  196.     DEF i=0
  197.     IF src[pos]="\a"
  198.         pos++
  199.         WHILE src[pos]<>"\a"
  200.             str[i]:=src[pos]
  201.             pos++
  202.             i++
  203.             CtrlC()
  204.             IF pos>length THEN Raise("EOF",pos)
  205.         ENDWHILE
  206.         str[i]:="\0"
  207.         pos++                // skip "\a"
  208.     ENDIF
  209. ENDPROC pos,str
  210.  
  211. PROC Skip(src:PTR TO CHAR,pos,length)
  212.     DEF done=FALSE,char
  213.     REPEAT
  214.         char:=src[pos]
  215.         IF char=" "
  216.             pos++
  217.         ELSEIF char="\t"
  218.             pos++
  219.         ELSEIF char=";"
  220.             pos++
  221.         ELSEIF char="\n"
  222.             pos++
  223.         ELSEIF char="/"
  224.             IF src[pos+1]="*"
  225.                 pos++
  226.                 REPEAT
  227.                     pos++
  228.                     IF pos>length THEN RETURN pos
  229.                 UNTIL (src[pos-1]="*")&&(src[pos]="/")
  230.                 pos++
  231.             ELSEIF src[pos+1]="/"
  232.                 pos++
  233.                 REPEAT
  234.                     pos++
  235.                     IF pos>length THEN RETURN pos
  236.                 UNTIL (src[pos]="\n")||((src[pos-1]="/")&&(src[pos]="/"))
  237.                 pos++
  238.             ELSE
  239.                 done:=TRUE
  240.             ENDIF
  241.         ELSE
  242.             done:=TRUE
  243.         ENDIF
  244.         IF pos>length THEN Raise("EOF",pos)
  245.     UNTIL done=TRUE
  246. ENDPROC pos
  247.  
  248. PROC IsAlphaNum(char) IS IF ((char>="A")&&(char<="Z"))||((char>="a")&&(char<="z"))||(char="_")||((char>="0")&&(char<="9"))||(char="#") THEN TRUE ELSE FALSE
  249.