home *** CD-ROM | disk | FTP | other *** search
- /*
- * splits a inline header file of gcc into multiple one-function-per-file
- * c files to generate glue-code.
- */
-
- IF ~SHOW("L","rexxsupport.library") THEN
- DO
- IF ~ADDLIB("rexxsupport.library",0,-30,34) THEN
- DO
- ECHO "No rexxsupport.library"
- RETURN 20
- END
- END
-
- filelist=SHOWDIR("gnu:os-include/inline","F","00"x)
-
- filelist=DELSTR(filelist,POS("stubs.h",filelist),8)
-
- DO WHILE filelist~==""
-
- PARSE VAR filelist filename "00"x filelist
-
- IF ~OPEN(infile,"gnu:os-include/inline/"filename,"R") THEN RETURN 20
- IF ~OPEN(outfile,filename,"W") THEN RETURN 20
-
- DO UNTIL EOF(infile)
- aline=READLN(infile)
- IF LEFT(aline,15)=="static __inline" THEN BREAK
- IF LEFT(aline,2)~=="__" & LEFT(aline,7)~=="#ifndef" & ,
- LEFT(aline,6)~=="#endif" THEN CALL WRITELN(outfile,aline)
- END
-
- IF ~CLOSE(outfile) THEN RETURN 20
-
- DO UNTIL EOF(infile)
-
- IF LEFT(aline,7)=="#define" THEN /* Is a macro */
- DO /* This construction leads to a lot of warnings, but they are harmless */
-
- funcname=WORD(aline,2)
- funcname=LEFT(funcname,POS("(",funcname)-1)
- aline=SUBSTR(aline,9)
-
- IF ~OPEN(outfile,funcname".c","W") THEN RETURN 20
-
- IF RIGHT(aline,1)=="\" THEN
- DO /* ... taglist type */
- bline=READLN(infile)
- start=POS("(",aline)
- DO WHILE start~=0
- aline=INSERT("long ",aline,start)
- start=POS(",",aline,start+1)
- END
- aline=INSERT(",",aline,POS("...",aline)-1)
- aline=LEFT(aline,LENGTH(aline)-1)
- bline=SUBSTR(bline,POS(";",bline)+1)
- bline=LEFT(bline,POS(";",bline)-1)
- bline=INSERT("&",bline,LASTPOS("_",bline))
- bline=DELSTR(bline,LASTPOS("_",bline),1)
- END
- ELSE
- DO /* Normal macro */
- bline=SUBSTR(aline,POS(")",aline)+2)
- aline=LEFT(aline,POS(")",aline))
- END
-
- CALL WRITELN(outfile,"#include <dos/dos.h>")
- CALL WRITELN(outfile,"#include <intuition/classusr.h>")
- CALL WRITELN(outfile,"#include <inline/"filename">")
- CALL WRITELN(outfile,"#undef "funcname)
- IF isvoid THEN
- DO
- CALL WRITELN(outfile,"void "aline)
- CALL WRITELN(outfile,"{ "bline"; }")
- END
- ELSE
- DO
- CALL WRITELN(outfile,"long "aline)
- CALL WRITELN(outfile,"{ return "bline"; }")
- END
-
- IF ~CLOSE(outfile) THEN RETURN 20
-
- DO UNTIL EOF(infile)
- aline=READLN(infile)
- IF LEFT(aline,15)=="static __inline" | ,
- LEFT(aline,7)=="#define" THEN BREAK
- END
- END
- ELSE
- DO /* Is a normal function -> no warnings generated */
-
- IF POS("void",aline)~=0 THEN /* Test for void type */
- isvoid=1
- ELSE
- isvoid=0
-
- bline=READLN(infile)
- funcname=WORD(bline,1)
-
- IF ~OPEN(outfile,funcname".c","W") THEN RETURN 20
-
- CALL WRITELN(outfile,"#include <dos/dos.h>")
- CALL WRITELN(outfile,"#include <intuition/classusr.h>")
- CALL WRITELN(outfile,"#include """filename"""")
- CALL WRITELN(outfile,SUBWORD(aline,3))
- CALL WRITELN(outfile,bline)
-
- DO UNTIL EOF(infile)
- aline=READLN(infile)
- IF LEFT(aline,15)=="static __inline" | ,
- LEFT(aline,7)=="#define" THEN BREAK
- IF LEFT(aline,2)~=="__" & LEFT(aline,7)~=="#ifndef" & ,
- LEFT(aline,6)~=="#endif" THEN CALL WRITELN(outfile,aline)
- END
-
- IF ~CLOSE(outfile) THEN RETURN 20
- END
- END
-
- IF ~CLOSE(infile) THEN RETURN 20
-
- END
-
- RETURN 0
-