|
|
Experimental Physics and
| ||||||||||||||||
|
|
Carl Susanna Jacobson wrote: Does anyone have a script or program that will take a set of C function declarations and generate the C code to register those functions with the iocsh? -- Carl Lionberger 510 486 7503 Software Developer, Engineering Division Lawrence Berkeley National Laboratory #!/usr/bin/perl
#
# makeRegistrar
#
# Takes [ansi vanilla] function prototypes and produces EPICS registrar
# function.
#
# output is to be inserted into code containing functions to be registered.
# Note the registrar function and its export call both use the program name
# "xxx", which you need to change by hand.
#
# be sure to include "iocsh.h" and "epicsExport.h" in the file.
#
# Example prototypes from autoSaveRestore:
#
# Clip these and use as test input if desired. Remove the ^#
#
#int set_savefile_name(char *filename, char *save_filename);
#int create_periodic_set(char *filename, int period, char *macrostring);
#int create_triggered_set(char *filename, char *trigger_channel,
# char *macrostring);
#int create_monitor_set(char *filename, int period, char *macrostring);
#int create_manual_set(char *filename, char *macrostring);
#int fdbrestore(char *filename);
#void fdblist(int verbose);
#
#int set_requestfile_path(char *path, char *pathsub);
#int set_savefile_path(char *path, char *pathsub);
#int set_saveTask_priority(int priority);
#int remove_data_set(char *filename);
#int reload_periodic_set(char *filename, int period, char *macrostring);
#int reload_triggered_set(char *filename, char *trigger_channel,
# char *macrostring);
#int reload_monitor_set(char * filename, int period, char *macrostring);
#int reload_manual_set(char * filename, char *macrostring);
#int fdbrestoreX(char *filename);
#
#
# input
#
$i = 0;
while (<>) {
# chomp();
@inlist[$i] = $_;
$i++;
}
#
# combine broken lines
#
$i = 0;$untermed=0;
foreach (@inlist) {
if (!/;$/) {
chomp;
@outlist[$i] = $_;
$untermed = 1;
}
else {
if ($untermed == 1) {
$untermed = 0;
@outlist[$i] = join("",@outlist[$i],$_);
} else {
@outlist[$i] = $_;
}
$i++;
}
}
#print @outlist;
#get args
$i = 0;
foreach (@outlist) {
($junk, $arglist) = split("[(]",$_);
($arglist, $junk) = split("[)]",$arglist);
@allargs[$i] = $arglist . "\n";
$i++;
}
#
# produce argument descriptors, arg lists, funcdefs, callfuncs
#
$i = 0;
$funcfound = 0;
foreach (@allargs) {
#
# note that is block of code is repeated below, to catch last
# member of list.
#
if ($funcfound == 1) {
$funcfound = 0;
print "static const iocshArg * const ".$funcname."Args\[" . $j ."\] = {\n";
for ($k = 0; $k < $j; $k++) {
print " &" . $funcname . "Arg" . $k;
if (($k + 1) < $j) {
print ",\n";
} else { print "\};\n"}
}
print "static const iocshFuncDef " . $funcname . "FuncDef = {";
print "\"". $funcname ."\"," . $j . "\," . $funcname."Args};\n";
print "static void " . $funcname . "CallFunc\(const iocshArgBuf *args)\n";
print "{\n";
print " " . $funcname . "\(";
for ($k = 0; $k < $j; $k++) {
print "args\[" . $k . "\]\.";
if (@types[$k] eq "iocshArgInt") {
print "ival"; }
if (@types[$k] eq "iocshArgString") {
print "sval"; }
if (@types[$k] eq "iocshArgDouble") {
print "dval"; }
if (($k + 1) < $j) {
print ",";
} else { print "\);\n"}
}
print "}\n";
}
($type, $funcname) = split(/\s+/,@outlist[$i]);
($funcname, $junk) = split(/\(/,$funcname);
$i++;
@names = "";
@types = "";
$j = 0;
@args = split;
$typefound = 0;
$charfound = 0;
foreach (@args) {
if ($charfound == 2) {
$charfound = 0;
@types[$j] = "iocshArgString";
if (/,$/) { chop($_); }
@names[$j] = $_;
$funcfound = 1;
print "static const iocshArg " . $funcname . "Arg" . $j . " = { ";
print "\"". @names[$j] . "\",". @types[$j] . " };\n";
$j++;
next;
}
if ($charfound == 1 && /\*/ && length($_) == 1) {
$charfound = 2;
next;
}
if ($charfound == 1 && /\*/ ) {
s/\*//;
$charfound = 0;
@types[$j] = "iocshArgString";
if (/,$/) { chop($_); }
@names[$j] = $_;
$funcfound = 1;
print "static const iocshArg " . $funcname . "Arg" . $j . " = { ";
print "\"". @names[$j] . "\",". @types[$j] . " };\n";
$j++;
next;
}
if ($charfound == 1) {
$charfound = 0;
@types[$j] = "iocshArgInt";
if (/,$/) { chop($_); }
@names[$j] = $_;
$funcfound = 1;
print "static const iocshArg " . $funcname . "Arg" . $j . " = { ";
print "\"". @names[$j] . "\",". @types[$j] . " };\n";
$j++;
next;
}
if (/char/) {
$charfound = 1;
next;
}
if (/unsigned/) {
$unsfound = 1;
next;
}
if ($intfound == 1) {
$intfound = 0;
@types[$j] = "iocshArgInt";
if (/,$/) { chop($_); }
@names[$j] = $_;
$funcfound = 1;
print "static const iocshArg " . $funcname . "Arg" . $j . " = { ";
print "\"". @names[$j] . "\",". @types[$j] . " };\n";
$j++;
next;
}
if ($unsfound == 1 || /char|int|long|short/) {
$unsfound = 0;
$intfound = 1;
next;
}
if ($doublefound ==1) {
$doublefound = 0;
@types[$j] = "iocshArgDouble";
if (/,$/) { chop($_); }
@names[$j] = $_;
$funcfound = 1;
print "static const iocshArg " . $funcname . "Arg" . $j . " = { ";
print "\"". @names[$j] . "\",". @types[$j] . " };\n";
$j++;
next;
}
if (/double|float/) {
$doublefound = 1;
next;
}
}
}
#
# this needs to be done one more time for the last function...
#
if ($funcfound == 1) {
$funcfound = 0;
print "static const iocshArg * const ".$funcname."Args\[" . $j ."\] = {\n";
for ($k = 0; $k < $j; $k++) {
print " &" . $funcname . "Arg" . $k;
if (($k + 1) < $j) {
print ",\n";
} else { print "\};\n"}
}
print "static const iocshFuncDef " . $funcname . "FuncDef = {";
print "\"". $funcname ."\"," . $j . "\," . $funcname."Args};\n";
print "static void " . $funcname . "CallFunc\(const iocshArgBuf *args)\n";
print "{\n";
print " " . $funcname . "\(";
for ($k = 0; $k < $j; $k++) {
print "args\[" . $k . "\]\.";
if (@types[$k] eq "iocshArgInt") {
print "ival"; }
if (@types[$k] eq "iocshArgString") {
print "sval"; }
if (@types[$k] eq "iocshArgDouble") {
print "dval"; }
if (($k + 1) < $j) {
print ",";
} else { print ");\n"}
}
print "}\n";
}
#
# end of last function work
#
# produce registrar function
#
print "\n";
print "void xxxRegister(void)\n";
print "{\n";
foreach (@outlist) {
($type, $funcname) = split(/\s+/,$_);
($funcname, $junk) = split(/\(/,$funcname);
print " iocshRegister(&" . $funcname . "FuncDef, " . $funcname . "CallFunc)\;\n";
}
print "}\n";
print "epicsExportRegistrar(xxxRegister)\;\n";
| ||||||||||||||||
| ANJ, 10 Nov 2011 |
·
Home
·
News
·
About
·
Talk
·
Base
·
Modules
·
Extensions
·
· Distributions · Download · Documents · Links · Licensing · |