pike.git / src / mklibpike.pike

version» Context lines:

pike.git/src/mklibpike.pike:1:   /* -  * $Id: mklibpike.pike,v 1.2 2005/01/03 17:59:05 grubba Exp $ +  * $Id: mklibpike.pike,v 1.3 2005/01/03 18:24:11 grubba Exp $    *    * Create strapping code for a list of symbols in pike.so,    * and the pike headerfiles.    *    * Henrik Grubbström 2005-01-03    */      constant default_headers = ({    "global.h",    "pike_embed.h",
pike.git/src/mklibpike.pike:70:    }    start = i+1;    }    }    return res;   }      int main(int argc, array(string) argv)   {    array(string) headers = default_headers; -  array(string) srcdirs = ({ ".", "/home/grubba/src/Pike/7.7/src", }); -  array(string) symbols = ({ -  "init_pike", -  "init_pike_runtime", -  "pike_set_default_master", -  "set_pike_debug_options", -  }); +  array(string) srcdirs = ({ "." }); +  array(string) symbols = ({ });       Stdio.File out = Stdio.stdout;    -  // FIXME: Argument parsing here. -  -  // Suggested arguments: -  // +  foreach(Getopt.find_all_options(argv, ({ +  ({ "help", Getopt.NO_ARG, ({ "-h", "--help" }) }), +  ({ "header", Getopt.HAS_ARG, ({ "-i", "--include" }) }), +  ({ "dir", Getopt.HAS_ARG, ({ "-I", "--include-dir" }) }), +  ({ "out", Getopt.HAS_ARG, ({ "-o", "--out" }) }), +  ({ "sym", Getopt.HAS_ARG, ({ "-s", "--sym" }) }), +  ({ "sym-file", Getopt.HAS_ARG, ({ "-S", "--sym-file" }) }), +  }), 1), [string key, string val]) { +  switch(key) { +  case "help":    // -h Help. -  +  werror("Usage:\n" +  " %s [ -I <include directory> ... ] \\\n" +  " [ -i <header-file> ... ] \\\n" +  " [ -s <symbol> ... ] \\\n" +  " [ -S <symbol-file> ... ] \\\n" +  " [ -o <output-file> ]\n", +  argv[0]); +  exit(0); +  break; +  case "header":    // -i Add include file. -  +  headers += ({ val }); +  break; +  case "dir":    // -I Add include directory. -  +  srcdirs += ({ val }); +  break; +  case "out":    // -o Specify output filename. -  +  if (out != Stdio.stdout) { +  werror("Output file specified multiple times.\n"); +  exit(1); +  } +  out = Stdio.File(); +  if (!out->open(val, "wct")) { +  werror("Failed to open %O for writing.\n", val); +  exit(1); +  } +  break; +  case "sym":    // -s Add single symbol. -  +  symbols += ({ val }); +  break; +  case "sym-file":    // -S Specify symbol file. -  +  string raw_syms = Stdio.read_file(val); +  if (!raw_syms) { +  werror("Failed to open symbol file %O.\n", val); +  exit(1); +  } +  symbols += String.trim_whites((replace(raw_syms, "\r", "")/"\n")[*]); +  break; +  } +  }    -  +  argv = Getopt.get_args(argv, 1); +  +  if (sizeof(argv) != 1) { +  werror("Too many arguments to %s.\n", argv[0]); +  exit(1); +  } +     string raw = cpp(sprintf("%{#include \"%s\"\n%}", headers), "include_all.c",    0,    C_Include_Handler(srcdirs));       array(Parser.C.Token|array) tokens =    Parser.C.strip_line_statements(    Parser.C.hide_whitespaces(    Parser.C.group(Parser.C.tokenize(Parser.C.split(raw)))    )    );       mapping(string:array(array(Parser.C.Token))) symbol_info = parse(tokens);       int fail; -  foreach(symbols, string sym) { +  foreach(Array.uniq(sort(symbols)), string sym) {    array(array(Parser.C.Token)) info = symbol_info[sym];    if (!info) {    werror("Symbol %O not found!\n", sym);    fail = 1;    continue;    }    string rettype = String.trim_whites(Parser.C.simple_reconstitute(info[0]));    string params = Parser.C.simple_reconstitute(info[1]);    out->write("static %s (*vec_%s)%s;\n"    "%s %s%s\n"