浏览代码

generate_plugin: generate source for plugin

Alexandre Janniaux 5 年之前
父节点
当前提交
cffa995319
共有 1 个文件被更改,包括 72 次插入0 次删除
  1. 72 0
      src/main.rs

+ 72 - 0
src/main.rs

@@ -104,12 +104,84 @@ fn link(args: LocalizeArgs)
 
 
     link_partial(&objects, &args.output_file).unwrap();
     link_partial(&objects, &args.output_file).unwrap();
     localize_hidden(&args.output_file);
     localize_hidden(&args.output_file);
+}
+
+struct PluginEntry
+{
+    lib: PathBuf,
+    prefix: String,
+}
 
 
+fn generate_plugin(plugins: &Vec<PluginEntry>, output: &PathBuf)
+{
 
 
+    let plugins_entries : Vec<String> = plugins
+        .iter()
+        .map(|plugin| plugin.prefix.clone() + "_entry")
+        .collect();
+
+    let prototypes = plugins_entries
+        .iter()
+        .map(|entry| String::from("int ") + entry + "(vlc_set_cb, void*);")
+        .fold(String::new(), |entries, entry| entries + &entry);
+
+    let entries = plugins_entries
+        .iter()
+        .fold(String::new(), |entries, entry|
+              entries + &entry + " ,");
+
+    let sources = format!(r"
+typedef int (*vlc_set_cb) (void *, void *, int, ...);
+typedef int (*vlc_plugin_entry) (vlc_set_cb, void *);
+
+{prototypes}
+
+vlc_plugin_entry vlc_plugin_entries[] = {{
+    {entries} NULL,
+}};
+
+int vlc_entry(vlc_set_cb func_set, void *opaque)
+{{
+    for(vlc_plugin_entry *entry=vlc_plugin_entries;
+        entry != NULL; entry++)
+    {{
+        int ret = entry(func_set, opaque);
+        if (ret != 0)
+            return ret;
+    }}
+}}
+
+const char * vlc_entry_license()
+{{
+    return {license};
+}}
+
+const char * vlc_entry_copyright()
+{{
+    return {copyright};
+}}
+
+const char * vlc_entry_api_version()
+{{
+    return {api_version};
+}}
+    ",
+    prototypes = prototypes,
+    entries = entries,
+    license = "\"none\"",
+    copyright = "\"none\"",
+    api_version = "\"4.0.0\"");
+
+    println!("Generated:\n{}", sources);
 }
 }
 
 
 fn main() {
 fn main() {
     let opt = LocalizeArgs::from_args();
     let opt = LocalizeArgs::from_args();
     println!("{:?}", opt);
     println!("{:?}", opt);
     link(opt);
     link(opt);
+
+    generate_plugin(&vec![
+        PluginEntry{ prefix: "vlc_video_output_test_truc".into(),
+                     lib: PathBuf::new() }
+    ], &PathBuf::new());
 }
 }