Ooops
January 15, 2021, 06:36:09 PM

Author Topic: [bmx] itoh by skidracer [ 1+ years ago ]  (Read 440 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] itoh by skidracer [ 1+ years ago ]
« on: June 29, 2017, 12:28:41 AM »
Title : itoh
Author : skidracer
Posted : 1+ years ago

Description : Only of interest to C/C++ programmers this code will scan the .i files of the specified module build - in this case win32 x86 release (good for Windows usage) and builds an interface for all the types, consts and globals it finds for use by C/C++ code.

Method table descriptions not yet implemented sorry.

WARNING: this program generates many files in currentdir so make sure you save it in it's own folder before running, the path $blitzmax/include might be a good choice.

<edit>

sry,

MingW not quite compatible, usable code coming soon...


Code :
Code: BlitzMax
  1. ' itoh.bmx
  2.  
  3. ' converts blitzmax .i interface files to c/c++ .h files
  4.  
  5. ' WARNING: this program generates many files in currentdir
  6.  
  7. Local modpath$=RequestDir("Please select your blitzmax/mod directory as source path",CurrentDir())
  8.  
  9. MakeHeaders modpath,".release.win32.x86","bb"
  10.  
  11. ' "C:/blitzmax/mod",".release.win32.x86","bb"
  12.  
  13. Function MakeHeaders(modpath$,suffix$,prefix$)
  14.         Local suffixi$=suffix+".i"
  15.         Local suffixa$=suffix+".a"
  16.         For Local d$=EachIn LoadDir(modpath)
  17.                 If d[d.length-4..]<>".mod" Continue
  18.                 For Local m$=EachIn LoadDir(modpath+"/"+d)
  19.                         If m[m.length-4..]<>".mod" Continue
  20.                         Local id$=d[..d.length-4]+"_"+m[..m.length-4]
  21.                         For Local f$=EachIn LoadDir(modpath+"/"+d+"/"+m)
  22. Rem
  23. uncomment to archive single super mods.a
  24.                                 If f[f.length-suffixa.length..]=suffixa
  25.                                         Local ar$="ar -vrus mods.a "+modpath+"/"+d+"/"+m+"/"+f
  26.                                         DebugLog ar
  27.                                         system_ ar
  28.                                         Continue
  29.                                 EndIf
  30. EndRem                         
  31.                                 If f[f.length-suffixi.length..]<>suffixi Continue
  32.                                 Local hpath$=d[..d.length-4]+"_"+f[..f.length-suffixi.length]+".h"
  33.                                 Local ipath$=modpath+"/"+d+"/"+m+"/"+f
  34.                                 CreateHeader hpath,ipath,id,prefix
  35.                         Next
  36.                 Next   
  37.         Next
  38.         Local b$=modpath+"/brl.mod/blitz.mod/"
  39.         CopyFile b+"blitz_types.h","blitz_types.h"
  40.         CopyFile b+"blitz_object.h","blitz_object.h"
  41.         CopyFile b+"blitz_array.h","blitz_array.h"
  42.         CopyFile b+"blitz_string.h","blitz_string.h"
  43.         CopyFile b+"blitz_debug.h","blitz_debug.h"
  44.         CopyFile b+"blitz_handle.h","blitz_handle.h"
  45. End Function
  46.  
  47. Function CreateHeader( hpath$,ipath$,id$,prefix$ )
  48.         Local f:TStream
  49.         Local l$,sname$,ssuper$,p,q
  50.         Local struct$
  51.         Local hdrs$,structs$,defs$,funcs$
  52.  
  53.         If id="brl_blitz"
  54.                 hdrs:+"#include ~qblitz_types.h~q~n"
  55.                 hdrs:+"#include ~qblitz_debug.h~q~n"
  56.                 hdrs:+"#include ~qblitz_object.h~q~n"
  57.                 hdrs:+"#include ~qblitz_string.h~q~n"
  58.                 hdrs:+"#include ~qblitz_array.h~q~n"
  59.                 hdrs:+"#include ~qblitz_handle.h~q~n"
  60.         EndIf
  61.  
  62.         f=ReadStream(ipath)
  63.         If Not f Return
  64.         While Not Eof(f)
  65.                 l=f.ReadLine()
  66.                 If l[..10]="ModuleInfo" Continue
  67.                
  68.                 If l[..7]="import "
  69.                         l=l[7..]       
  70.                         If l[..1]="~q" Continue 'ignore misc import directives
  71.                         p=l.findlast(".")
  72.                         If p=-1
  73.                                 DebugStop
  74.                         EndIf
  75.                         l=l.Replace(".","_")
  76. '                       l=l[p+1..]
  77.                         hdrs:+"#include ~q"+l+".h~q~n"
  78.                         Continue
  79.                 EndIf
  80.                 If l[l.length-1..]="{"
  81.                         p=l.find("^")
  82.                         If p<>-1
  83.                                 sname=l[..p]
  84.                                 ssuper=l[p+1..l.length-1]
  85.                                 p=ssuper.findlast(".")
  86.                                 ssuper=":"+ssuper[p+1..]
  87.                                 If ssuper=":Null" ssuper=""    
  88.                                 ssuper=ssuper.Replace(":Object",":BBObject")           
  89.                                 struct$="struct "+sname+ssuper+"{~n"
  90. '                               DebugLog struct
  91.                         EndIf
  92.                         Continue
  93.                 EndIf
  94.                 If struct
  95.                         If l[..2]="}=" Or l[..3]="}A=" Or l[..3]="}E="
  96.                                 struct:+"};~n~n"                       
  97. '                               DebugLog struct
  98.                                 structs:+struct
  99.                                 struct=""
  100.                                 Continue
  101.                         EndIf          
  102.                         If l[..1]="."
  103.                                 l=l[1..l.length-1]
  104.                                 struct:+"~t"+bb2c(l)+";~n"
  105.                
  106.                         EndIf
  107.                         Continue
  108.                 EndIf
  109.                 p=l.findlast("=")
  110.                 If p<>-1
  111.                         Select l[p-1..p]
  112.                                 Case ")"
  113.                                         Local bbname$,args$,ftype$
  114.                                         bbname=l[p+1..]
  115.                                         l=l[..p]
  116.                                         p=l.find("(")
  117.                                         args=l[p+1..l.length-1]
  118.                                         l=l[..p]
  119.                                         funcs:+funcbb2c(l,bbname,args,prefix)
  120. '                                       DebugLog "FUNCTION:l="+l+" bbname="+bbname+" args="+args
  121.                                 Case "%"
  122.                                         defs:+"#define "+l[..p-1]+" "+l[p+1..]+"~n"
  123.                                 Case "$"
  124.                                         defs:+"#define "+l[..p-1]+" "+l[p+2..]+"~n"
  125.                                 Case "&"
  126. '                                       DebugLog "Ptr= ??? "+l
  127.                                 Case "S"
  128. '                                       DebugLog "STDCALL Function= ??? "+l
  129.                                 Default
  130.                                         DebugStop
  131.                         End Select
  132.                         Continue
  133.                 EndIf
  134.         Wend
  135.         CloseFile f
  136.        
  137.         id=id.ToUpper()+"_H"
  138.  
  139.  
  140.         Local h$=hdrs+"~n"+defs+"~n"+structs+funcs
  141.        
  142.         h="#ifndef "+id+"~n#define "+id+"~n~n"+h+"#endif~n"
  143.                
  144.         SaveText h,hpath
  145.  
  146. End Function
  147.  
  148.  
  149. Function funcbb2c$(l$,bbname$,args$,prefix$)
  150.         Local h$,a$
  151.         bbname=bbname[1..bbname.length-1]
  152.         h=bb2c(l)+"("   'strips l and returns c decl
  153.         h=h.Replace(l+"(",bbname+"(")
  154.         While True
  155.                 a=getarg(args)
  156.                 If Not a Exit
  157.                 h:+bb2c(a)
  158.                 If args h:+"," 
  159.         Wend
  160.         h:+");~n"
  161.         l=prefix+l
  162.         If l<>bbname
  163.                 h:+"#define "+l+" "+bbname+"~n~n"
  164.         EndIf
  165. '       DebugLog h
  166.         Return h
  167. End Function
  168.  
  169.  
  170. Function bb2c$(bb$ Var) 'on return strips input string to friendly name
  171.         Local p,t$,eq$,fn$,ar$,std$
  172.  
  173.         Local o$=bb
  174.        
  175.         p=bb.find("=")
  176.         If p<>-1
  177.                 eq$=bb[p..]
  178.                 bb=bb[..p]
  179.                 If eq[..2]="=~q"
  180.                         eq=eq[2..eq.length-1]
  181.                         If eq[..2]="bb"
  182.                                 eq="&"+eq
  183.                         EndIf
  184.                         eq="="+eq
  185.                 EndIf
  186.                 If eq[..2]="=$"
  187.                         If eq="=$~q~q"
  188.                                 eq="=&bbEmptyString"
  189.                         Else
  190.                                 DebugLog "&&&&&&&&"+eq
  191.                                 eq=""
  192.                         EndIf
  193.                 EndIf
  194.                 Select eq[eq.length-1..]
  195.                         Case "!","#"
  196.                                 eq=eq[..eq.length-1]
  197.                                 If eq.find(".")=-1 eq=eq+".0"
  198.                                 eq=eq+"f"
  199.                 End Select
  200.         EndIf
  201.  
  202.         While bb.length
  203.                 If bb[bb.length-4..]=" Var"
  204.                         t="&"+t
  205.                         bb=bb[..bb.length-4]
  206.                         Continue               
  207.                 EndIf
  208.  
  209.                 If bb[bb.length-2..]=")S"
  210.                         bb=bb[..bb.length-1]
  211.                         std="__stdcall "
  212.                 EndIf
  213.  
  214.                
  215.                 Select bb[bb.length-1..]
  216.                         Case ")"
  217.                                 p=bb.find("(")
  218.                                 fn=bb[p..bb.length]
  219.                                 bb=bb[..p]
  220.                                
  221.                                 Local args$=fn[1..fn.length-1]
  222.                                 If args
  223.                                         fn=""
  224.                                         While True
  225.                                                 Local a$=getarg(args)
  226.                                                 If Not a Exit
  227.                                                 fn:+bb2c(a)
  228.                                                 If args fn:+","
  229.                                         Wend
  230.                                         fn="("+fn+")"
  231.                                 EndIf
  232.  
  233.                                 Continue                               
  234.                         Case "%"
  235.                                 If bb[bb.length-2..]="%%"
  236.                                         t="BBInt64"+t
  237.                                         bb=bb[..bb.length-2]
  238.                                         Continue
  239.                                 EndIf
  240.                                 t="int"+t
  241.                         Case "#"
  242.                                 t="float"+t
  243.                         Case "!"
  244.                                 t="double"+t
  245.                         Case "$"
  246.                                 t="BBString*"+t
  247.                         Case "z"
  248.                                 If bb[bb.length-2..]="$z"
  249.                                         t="const char *"+t
  250.                                         bb=bb[..bb.length-2]
  251.                                         Continue
  252.                                 EndIf
  253.                         Case "@"
  254.                                 If bb[bb.length-2..]="@@"
  255.                                         t="BBSHORT"+t
  256.                                         bb=bb[..bb.length-2]
  257.                                         Continue
  258.                                 EndIf
  259.                                 t="BBBYTE"+t
  260.                         Case "*"
  261.                                 t="*"+t
  262. 'Function LoadDir$[]( dir$,skip_dots=True )
  263. '       Object&[]* _datas;
  264.                         Case "]"
  265.                                 p=bb.find("&[")
  266. '                               If bb[bb.length-3..]="&[]"
  267.                                 If p<>-1
  268.                                         ar="BBArray*"+t
  269.                                         bb=bb[..p]
  270.                                         Continue
  271.                                 EndIf                  
  272.                                 DebugStop
  273.                         Default
  274.  
  275.                                 p=bb.find(":")
  276.                                 If p<>-1
  277.                        
  278.                                         If t DebugStop
  279.                                        
  280.                                         o=bb[p+1..]
  281.                                         bb=bb[..p]
  282.                                         p=o.findlast(".")       'typedef
  283.                                         o=o[p+1..]
  284.                                        
  285.                                         If o="Object"
  286.                                                 o="BBObject"
  287.                                         Else
  288.                                                 If eq
  289.                                                         eq="=("+o+"*)"+eq[1..]
  290.                                                 EndIf
  291.                                         EndIf
  292.                                        
  293. '                                       If bb="_datas" DebugStop
  294.                        
  295.                                         If ar Return ar+" "+bb
  296.  
  297. '                                       DebugLog"default:"+o+" *"+bb
  298.                                        
  299.                                         Return o+" *"+bb+eq
  300.                                 EndIf
  301.  
  302.                                 If bb="char" bb="c"
  303.                                 If ar t=ar      'ignore type of array for now
  304.                                 If fn                                  
  305. '                                       DebugLog "FN:"+t+"("+bb+")"+fn+eq
  306.                                         Return t+"("+std+bb+")"+fn+eq
  307.                                 EndIf
  308.                                 If t="Object&[]*" DebugStop
  309.                                
  310.                                 Return t$+" "+bb+eq
  311.                 End Select                     
  312.                 bb=bb[..bb.length-1]
  313.         Wend
  314. End Function
  315.  
  316. Function getarg$(arg$ Var)
  317.         Local p=arg.find(",")
  318.         Local q=arg.find("(")
  319.         If q<>-1 And q<p        'needs to handle nest
  320.                 q=arg.find(")",q)
  321.                 p=arg.find(",",q)
  322.         EndIf
  323.         If p=-1 p=arg.length
  324.         Local a$=arg[..p]
  325.         arg=arg[p+1..]
  326.         Return a
  327. End Function


Comments :


N(Posted 1+ years ago)

 Slightly modified, included in comments my changes.  This produces working code at times, from what I can see, the only issue is that of referencing stuff that has not yet been declared (structures, specifically, absolutely need to be declared in prototype form before they get really defined -- may write my own parser to handle this, since this is kind of messy at the moment).
Code: [Select]
' itoh.bmx

' converts blitzmax .i interface files to c/c++ .h files

' WARNING: this program generates many files in currentdir

Local modpath$=RequestDir("Please select your blitzmax/mod directory as source path",CurrentDir())

MakeHeaders modpath,".release.win32.x86","bb"

' "C:/blitzmax/mod",".release.win32.x86","bb"

Function MakeHeaders(modpath$,suffix$,prefix$)
    Local suffixi$=suffix+".i"
    Local suffixa$=suffix+".a"
    For Local d$=EachIn LoadDir(modpath)
        If d[d.length-4..]<>".mod" Continue
        For Local m$=EachIn LoadDir(modpath+"/"+d)
            If m[m.length-4..]<>".mod" Continue
            Local id$=d[..d.length-4]+"_"+m[..m.length-4]
            For Local f$=EachIn LoadDir(modpath+"/"+d+"/"+m)
Rem
uncomment to archive single super mods.a
                If f[f.length-suffixa.length..]=suffixa
                    Local ar$="ar -vrus mods.a "+modpath+"/"+d+"/"+m+"/"+f
                    DebugLog ar
                    system_ ar
                    Continue
                EndIf
EndRem              
                If f[f.length-suffixi.length..]<>suffixi Continue
                Local hpath$=d[..d.length-4]+"_"+f[..f.length-suffixi.length]+".h"
                Local ipath$=modpath+"/"+d+"/"+m+"/"+f
                CreateHeader hpath,ipath,id,prefix
            Next
        Next    
    Next
    Local b$=modpath+"/brl.mod/blitz.mod/"
    CopyFile b+"blitz_types.h","blitz_types.h"
    CopyFile b+"blitz_object.h","blitz_object.h"
    CopyFile b+"blitz_array.h","blitz_array.h"
    CopyFile b+"blitz_string.h","blitz_string.h"
    CopyFile b+"blitz_debug.h","blitz_debug.h"
    CopyFile b+"blitz_handle.h","blitz_handle.h"
End Function

Function CreateHeader( hpath$,ipath$,id$,prefix$ )
    Local f:TStream
    Local l$,sname$,ssuper$,p,q
    Local struct$
    Local hdrs$,structs$,defs$,funcs$

    If id="brl_blitz"
        hdrs:+"#include ~qblitz_types.h~q~n"
        hdrs:+"#include ~qblitz_debug.h~q~n"
        hdrs:+"#include ~qblitz_object.h~q~n"
        hdrs:+"#include ~qblitz_string.h~q~n"
        hdrs:+"#include ~qblitz_array.h~q~n"
        hdrs:+"#include ~qblitz_handle.h~q~n"
    EndIf

    f=ReadStream(ipath)
    If Not f Return
    While Not Eof(f)
        l=f.ReadLine()
        If l[..10]="ModuleInfo" Continue
       
        If l[..7]="import "
            l=l[7..]    
            If l[..1]="~q" Continue 'ignore misc import directives
            p=l.findlast(".")
            If p=-1
                DebugStop
            EndIf
            l=l.Replace(".","_")
'           l=l[p+1..]
            hdrs:+"#include ~q"+l+".h~q~n"
            Continue
        EndIf
        If l[l.length-1..]="{"
            p=l.find("^")
            If p<>-1
                ' MODIFIED BY NOEL
                sname=l[..p]
                ssuper=l[p+1..l.length-1]
                p=ssuper.findlast(".")
                ssuper=ssuper[p+1..] ' : not needed.
                If ssuper="Null" ssuper=""
                ssuper=ssuper.Replace("Object","BBObject")  ' Also removed : here
                struct$="typedef struct s_"+sname+"{~n~t"+ssuper+" super;~n" ' Changed the output, see Rem below
               
                Rem
                    Now produces code like
                        typedef struct s_$sname {
                            $ssuper super;
                            ...
                        } $sname; // I was tempted to do sname_t,
                                  //but.. I'll go easy on the C conventions
                EndRem

'               DebugLog struct
            EndIf
            Continue
        EndIf
        If struct
            If l[..2]="}=" Or l[..3]="}A=" Or l[..3]="}E="
                struct:+"} "+sname+";~n~n"
'               DebugLog struct
                structs:+struct
                struct=""
                Continue
            EndIf      
            If l[..1]="."
                l=l[1..l.length-1]
                ' MODIFIED BY NOEL
                ' new argument to ensure that structs can reference themselves.  Defaults to ""
                struct:+"~t"+bb2c(l,sname)+";~n"
       
            EndIf
            Continue
        EndIf
        p=l.findlast("=")
        If p<>-1
            Select l[p-1..p]
                Case ")"
                    Local bbname$,args$,ftype$
                    bbname=l[p+1..]
                    l=l[..p]
                    p=l.find("(")
                    args=l[p+1..l.length-1]
                    l=l[..p]
                    funcs:+funcbb2c(l,bbname,args,prefix)
'                   DebugLog "FUNCTION:l="+l+" bbname="+bbname+" args="+args
                Case "%"
                    defs:+"#define "+l[..p-1]+" "+l[p+1..]+"~n"
                Case "$"
                    defs:+"#define "+l[..p-1]+" "+l[p+2..]+"~n"
                Case "&"
'                   DebugLog "Ptr= ??? "+l
                Case "S"
'                   DebugLog "STDCALL Function= ??? "+l
                Default
                    DebugStop
            End Select
            Continue
        EndIf
    Wend
    CloseFile f
   
    id=id.ToUpper()+"_H"


    Local h$=hdrs+"~n"+defs+"~n"+structs+funcs
   
    h="#ifndef "+id+"~n#define "+id+"~n~n"+h+"#endif~n"
       
    SaveText h,hpath

End Function


Function funcbb2c$(l$,bbname$,args$,prefix$)
    Local h$,a$
    bbname=bbname[1..bbname.length-1]
    h=bb2c(l)+"("   'strips l and returns c decl
    h=h.Replace(l+"(",bbname+"(")
    While True
        a=getarg(args)
        If Not a Exit
        h:+bb2c(a)
        If args h:+","  
    Wend
    h:+");~n"
    l=prefix+l
    If l<>bbname
        h:+"#define "+l+" "+bbname+"~n~n"
    EndIf
'   DebugLog h
    Return h
End Function

Rem
 MODIFIED BY NOEL
 New argument to ensure that structs can reference themselves, e.g.
 
 typedef struct s_ILink {
    BBObject        super;
    struct s_ILink*     p; // Important to allow it to compile in C.  Not sure if this applies in C++...
    struct s_ILink*     n;
    BBObject*           v;
 } ILink;
EndRem
Function bb2c$(bb$ Var, typename$="")   'on return strips input string to friendly name
    Local p,t$,eq$,fn$,ar$,std$

    Local o$=bb
   
    p=bb.find("=")
    If p<>-1
        eq$=bb[p..]
        bb=bb[..p]
        If eq[..2]="=~q"
            eq=eq[2..eq.length-1]
            If eq[..2]="bb"
                eq="&"+eq
            EndIf
            eq="="+eq
        EndIf
        If eq[..2]="=$"
            If eq="=$~q~q"
                eq="=&bbEmptyString"
            Else
                DebugLog "&&&&&&&&"+eq
                eq=""
            EndIf
        EndIf
        Select eq[eq.length-1..]
            Case "!","#"
                eq=eq[..eq.length-1]
                If eq.find(".")=-1 eq=eq+".0"
                eq=eq+"f"
        End Select
    EndIf

    While bb.length
        If bb[bb.length-4..]=" Var"
            t="&"+t
            bb=bb[..bb.length-4]
            Continue        
        EndIf

        If bb[bb.length-2..]=")S"
            bb=bb[..bb.length-1]
            std="__stdcall "
        EndIf

       
        Select bb[bb.length-1..]
            Case ")"
                p=bb.find("(")
                fn=bb[p..bb.length]
                bb=bb[..p]
               
                Local args$=fn[1..fn.length-1]
                If args
                    fn=""
                    While True
                        Local a$=getarg(args)
                        If Not a Exit
                        fn:+bb2c(a)
                        If args fn:+","
                    Wend
                    fn="("+fn+")"
                EndIf

                Continue                
            Case "%"
                If bb[bb.length-2..]="%%"
                    t="BBInt64"+t
                    bb=bb[..bb.length-2]
                    Continue
                EndIf
                t="int"+t
            Case "#"
                t="float"+t
            Case "!"
                t="double"+t
            Case "$"
                t="BBString*"+t
            Case "z"
                If bb[bb.length-2..]="$z"
                    t="const char *"+t
                    bb=bb[..bb.length-2]
                    Continue
                EndIf
            Case "@"
                If bb[bb.length-2..]="@@"
                    t="BBSHORT"+t
                    bb=bb[..bb.length-2]
                    Continue
                EndIf
                t="BBBYTE"+t
            Case "*"
                t="*"+t
'Function LoadDir$[]( dir$,skip_dots=True )
'   Object&[]* _datas;
            Case "]"
                p=bb.find("&[")
'               If bb[bb.length-3..]="&[]"
                If p<>-1
                    ar="BBArray*"+t
                    bb=bb[..p]
                    Continue
                EndIf          
                DebugStop
            Default

                p=bb.find(":")
                If p<>-1

                    If t DebugStop
                   
                    o=bb[p+1..]
                    bb=bb[..p]
                    p=o.findlast(".")   'typedef
                    o=o[p+1..]

                    If o="Object"
                        o="BBObject"
                    Else
                        If eq
                            eq="=("+o+"*)"+eq[1..]
                        EndIf
                    EndIf

                    ' MODIFIED BY NOEL:
                    ' Where that new argument comes into play.  If it matches, of course, prepend the necessary bit
                    If o = typename Then o = "struct s_"+o
                   
'                   If bb="_datas" DebugStop
           
                    If ar Return ar+" "+bb

'                   DebugLog"default:"+o+" *"+bb
                   
                    Return o+" *"+bb+eq
                EndIf

                If bb="char" bb="c"
                If ar t=ar  'ignore type of array for now
                If fn                  
'                   DebugLog "FN:"+t+"("+bb+")"+fn+eq
                    Return t+"("+std+bb+")"+fn+eq
                EndIf
                If t="Object&[]*" DebugStop
               
                Return t$+" "+bb+eq
        End Select          
        bb=bb[..bb.length-1]
    Wend
End Function

Function getarg$(arg$ Var)
    Local p=arg.find(",")
    Local q=arg.find("(")
    If q<>-1 And q<p    'needs to handle nest
        q=arg.find(")",q)
        p=arg.find(",",q)
    EndIf
    If p=-1 p=arg.length
    Local a$=arg[..p]
    arg=arg[p+1..]
    Return a
End Function
Aside from what I noted, the code this produces now seems to work for me.


skidracer(Posted 1+ years ago)

 Thanks Noel.Just been trying to build interfaces for an application not just modules. Unfortunately the main .bmx build file does not generate a .i so you need to declare a single line .bmx file that imports yourapp.bmx, build the single line version in release mode and then run the following selecting yourapp.bmx  (not the stub) as the application source in the second requester. This could be easily automated with a few calls to bmk once some other issues get ironed out.My new initialization code now looks like this:
Code: [Select]
Strict

Const BUILD$=".release.win32.x86"
Const PREFIX$="bb"

Local cd$=CurrentDir()

Local modpath$=RequestDir("Please select your blitzmax/mod directory as source path",cd)

MakeHeaders modpath,BUILD,PREFIX

Local app$=RequestFile("Please select your application.bmx","BlitzMax Source:bmx",False,cd)
Local path$=app[..app.length-4]
Local dir$=ExtractDir(path)
Local ifile$=dir+"/.bmx/"+StripDir(app)+BUILD+".i"

CreateHeader( path+".h",ifile,"",prefix$ )

End


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal