add trailing slash to base_path in transmute
[antimony.git] / transmute / transmute.sb
blob376a82260915f9a72c099fb4b95a7755dba4dcbc
1 # Antimony compiler.
3 section functions
5 export main
6 import sb.args sb.blob_from_cstring sb.compile_executable \
7   sb.compile_executable_to_voodoo sb.compile_module \
8   sb.compile_module_to_voodoo sb.init_voodoo_translator sb.transmute_stream
10 function namespace_from_path path base_path {
11   var namespace = -1
12   if (ne base_path -1) {
13     set base_path concatenate_blobs base_path "/"
14     if (blob_starts_with path base_path) {
15       let prefix_len blob_length base_path
16       set path copy_blob_part path prefix_len (sub (blob_length path) prefix_len)
17     }
18   }
19   loop {
20     let path_len blob_length path
21     let max sub path_len 1
22     var start = 0
23     var end = 0
24     var got_part = false
25     do
26     set got_part false
27     if (eq end path_len) {
28       set got_part true
29     } else if (eq (blob_nth path end) 47) {
30       set got_part true
31     }
32     if (eq got_part true) {
33       var len = sub end start
34       if (gt len 0) {
35         let part copy_blob_part path start len
36         if (eq namespace -1) {
37           set namespace get_namespace_absolute part
38         } else {
39           set namespace get_namespace (namespace_intern namespace part)
40         }
41       }
42       set start add end 1
43     }
44     while (lt end path_len)
45     set end add end 1
46   }
47   return namespace
50 function main args {
51   var base_path = -1
52   var format = -1
53   var namespace = -1
54   var source = -1
55   var target = -1
56   var type = "module"
57   var library_path = dynarray 0 0
58   loop {
59     var i = 1
60     var arg = 0
61     var len = array_length args
62     do
63     while (lt i len)
64     set arg array_nth args i
65     if (gt (blob_length arg) 0) {
66       var c = blob_nth arg 0
67       if (blobs_equal arg "-L") {
68         set i add i 1
69         dynarray_add library_path (array_nth args i)
70       } else if (blobs_equal arg "-b") {
71         set i add i 1
72         set base_path (array_nth args i)
73       } else if (blobs_equal arg "-f") {
74         set i add i 1
75         set format (array_nth args i)
76       } else if (blobs_equal arg "-o") {
77         set i add i 1
78         set target (array_nth args i)
79       } else if (blobs_equal arg "-t") {
80         set i add i 1
81         set type (array_nth args i)
82       } else if (eq c 45) {             # -
83         error (concatenate_blobs "Flag not recognized: " arg)
84       } else {
85         set source arg
86       }
87     }
88     set i add i 1
89   }
91   if (eq source -1) {
92     if (eq target -1) {
93       # Old behavior, used to bootstrap Antimony.
94       set namespace symbol_namespace #`true
95       sb.transmute_stream namespace standard_input standard_output
96     } else {
97       error "Target specified, but no source"
98     }
99   } else if (eq target -1) {
100     error "Source specified, but no target"
101   } else if (blobs_equal type "exe") {
102     set namespace (namespace_from_path source base_path)
103     if (eq format -1) {
104       sb.compile_executable namespace source target (dynarray_to_array library_path)
105     } else if (blobs_equal format "voodoo") {
106       mkdir target 511
107       sb.compile_executable_to_voodoo namespace source target
108     } else {
109       error (concatenate_blobs "Format not supported: " format)
110     }
111   } else if (blobs_equal type "module") {
112     set namespace (namespace_from_path source base_path)
113     if (eq format -1) {
114       sb.compile_module namespace source target
115     } else if (blobs_equal format "voodoo") {
116       mkdir target 511
117       sb.compile_module_to_voodoo namespace source target
118     } else {
119       error (concatenate_blobs "Format not supported: " format)
120     }
121   } else {
122     error (concatenate_blobs "Format not supported: " format)
123   }
125   return 0
128 sb.init_voodoo_translator
129 main (sb.args)