Thanks to all. Will report back in due course. Thanks for the complete man page Martin. In case you wanted to know, an abbreviated version of the same is available in the sym2ijs.ijs file here http://www.jsoftware.com/svn/base7/trunk/main/defs/
On Wed, Jun 1, 2011 at 3:08 PM, <[email protected]> wrote: >>I need to interact with some binary files that are basically stored C >>structures. > > I can suggest two distinct tools. > > The older one from 1999 is: > http://juggle.gaertner.de/bnp/c2j.html > > This article was originally published in Vector v16n2. This approach > is self-contained in J but assumes that you most probably manually > describe structure layouts, ending up with non-portable code. > > I expect this article will give you a viable approach to dissect > your datafiles. > > Second tool: > > For the J 4.x Release whose Unix port I took care of in 2000, I was > faced with the problem that both the socket and the regexp functions > where killed off as foreigns 16!:n and 17!:n implemented in C. The > task was to replace them by 15!:0-based implementations in J. > (Two bad moves, in my opinion.) I devised "sym2ijs", a portable tool > which allows you to specify various items "in the C world" you want > to interface to and get the proper values **on the the target > system** where your code is supposed to run. > > (My original setup (which I still use and prefer) is based > on a makefile rule (whose purpose was obviously never understood > by JSoftware), a mostly awk-based shell script, and a man-page. > JSoftware transformed all that into a J script so it is usable > on Windows, too, fair enough. > > I can't be bothered to hunt for its current place or documentation > beyond a naive but unsuccessful search on jsoftware.com, so here > is my old man page. > > Martin > > neitzel 27 > man sym2ijs > > sym2ijs(1) sym2ijs(1) > > NAME > sym2ijs - translate C type and constant declarations into > J definitions > > SYNOPSIS > sym2ijs [ -k | -c | -cc | -C compiler-command ] ... > [filename.sym] > > DESCRIPTION > Sym2ijs converts header definitions given in C (and the C > preprocessor) into equivalent J definitions. It expects a > compact input format listing the symbols of interest and > generates the corresponding J script defining the same (or > closely related) symbols. > > Input is expected either in a file with a .sym suffix, in > which case the output is written to a corresponding file- > name.ijs file, or on stdin, generating the J definitions > to stdout. > > A short example for the expected input format which is > detailled further below is this: > > <sys/types.h> > <sys/stat.h> > > i S_IFIFO S_IFCHR S_IFDIR S_IFBLK S_IFREG > i S_IROTH S_IWOTH S_IXOTH > t struct stat > f st_mode > f st_uid > > Filtered through sym2ijs, this will generate the following > J script on a Sun system: > > NB. do not edit -- created by sym2ijs from - > S_IFIFO =: 4096 > S_IFCHR =: 8192 > S_IFDIR =: 16384 > S_IFBLK =: 24576 > S_IFREG =: 32768 > S_IROTH =: 4 > S_IWOTH =: 2 > S_IXOTH =: 1 > stat_sz =: 136 > st_mode_off =: 20 > st_mode_sz =: 4 > st_uid_off =: 28 > st_uid_sz =: 4 > > The above compiles integer constants and some information > about the stat structure type and two of its fields. > Equipped with all these values, a J programmer can access > stat structures with memr and memw. There is no need to > figure out C header values or offsets manually or to hard- > wire those (usually system-dependent) values anywhere. > > The purpose of this tool is portable J code sticking to C > APIs as published in library manual pages. Sym2ijs cre- > ates an intermediate C language program and runs the sys- > tem's C compiler on that. This intermediate program in > turn will be run once and print all the J assignments. > Something like make(1) is perfect to re-create the J defi- > nitions whenever necessary. > > OPTIONS > Options must be listed separately, i.e., they may not be > aggregated under a common hyphen. > > -C compiler-call > Sym2ijs will search automatically for some standard > compiler names: cc, gcc, c89, acc, lcc, xlc. If > that should not fit the bill, you can set the com- > piler name explicitly. You can also add some flags > if you take care of the proper quoting. For exam- > ple, > > sym2ijs -C "gcc -I../inc -DFOO='has some blanks'" foo.sym > > -k keep any intermediate files. If the file foo.ijs > is processed, there will be the intermediate files > foo.c and foo in order to create the final output > file foo.ijs. If stdin is processed, the files > will be named sym2ijsPID.c and sym2ijsPID in the > /tmp directory, with .I PID being a unique process > id. > > -c Stop after generation of the C input file (implies > -k). > > -cc Stop after compilation of the C input file (implies > -k). > > INPUT FORMAT > Input will most likely start with the listing of some pre- > requiste #include files. The first empty line in the > input marks the transition from the header section to the > section with various directives to translate symbols. > > Every input line is analyzed according to the character or > word at the very beginning of the line. No line may be > indented. The rest of the line may employ arbitrary forms > of white space. The following input line formats are rec- > ognized and processed: > > <filename> > Include the specified system header file. > > "filename" > Include the specified "local" header file. > > first emtpy line > Switch from global section in the intermediary C > program to the main() function issuing all the > print statements for the values. No further header > files may be listed after this line. > > other empty lines > ... will be simply preserved in the J script out- > put. > > c symbol ... > > i symbol ... > > s symbol ... > Typed symbols (of type char, integer, or "string" > resp.) defined as C header constants or C > variables. Corresponding assignments to J symbols > will be generated. > > t typename > Define the (J) symbol typename_sz to have the value > of (C) sizeof(typename). > > st typename > > st struct structtag > A structure type is introduced, leading to a type- > name_sz or structtag_sz definition as above. In > addition, any following f lines for fields will > refer to this structure. The optional struct key- > word has to be used where only this type of defin- > tion is used in the header file (and the man > pages). > > f fieldname > Define fieldname_sz and the offset fieldname_off > for a member of the structure type mentioned last. > > ; comment words ... > A comment line which will be completely ignored. > > C literal C code > > J literal J code > The lines will be passed as-is to the intermediate > C or final J program. The initial C or J along > with the first (optional) white space character > will be removed, the rest is passed literally. > > # C preprocessor directive > These, too, will be passed to the intermediate C > program. They allow for easy conditional code as > in this example: > > i MAP_SHARED MAP_PRIVATE MAP_FIXED > #ifdef sun > i MAP_NOPRESERVE > #endif > > SEE ALSO > cc(1), j(1), make(1). > > DIAGNOSTICS > Error messages can be a bit puzzling. They might be from > any stage of the entire translation process: failures to > read the input, failures to compile the intermediate C > program, failures to run it. > > RESTRICTIONS > Perhaps there should be more support for different types. > Unsigned integers should get their own code; perhaps they > should better be translated into J extended integers. > > AUTHOR > Martin Neitzel, Gaertner Datensysteme, [email protected] > > > sym2ijs(1) > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
