english
version "1.0"
identify "%Z%%M% %I% %E%"
#: Copyright (c) 1995-2005 by Wayne C. Gramlich.
#, All rights reserved.
module c_import
#: This module implements functionality that allows the importing of
#, C code into STIPPLE program. If the C code is well written and
#, this module is used properly, the result is safe and proper STIPPLE
#, code; otherwise, you can get some extremely strange behavior using
#, this module.
define c_bind #: C/STIPPLE name binding
record
c_name string #: The C name
stipple_comment string #: The STIPPLE comment
stipple_name string #: The STIPPLE type name
generate allocate, erase, print
define c_define #: C #define
record
c_name string #: Name of #define
value string #: Value of #define
generate allocate, erase, print
define c_enumeration #: C/STIPPLE enumeration
record
c_name string #: C name of type
exact_match logical #: ({true}=>exact;{false}=>loose) match
kind c_kind #: Kind of C enumeration
items vector[c_bind] #: List of item names
stipple_co_type string #: STIPPLE type name for C enum values
stipple_comment string #: STIPPLE comment string
stipple_name string #: STIPPLE type name for STIPPLE values
generate allocate, erase, print
define c_field #: One field of a record/struct
record
c_name string #: The C name for the field
stipple_comment string #: The STIPPLE comment for the field
stipple_name string #: The STIPPLE name for the field
type c_sub_type #: The type of the field
generate_get logical #: {true} generate a get routine
generate_set logical #: {true} generate a set routine
generate allocate, erase, print
define c_kind #: Kind of C structure definition
enumeration
defines #: enum is a bunch of #define's
enum #: enum name {...};
struct #: struct name {...};
typedef_enum #: typedef enum {...} name;
typedef_struct #: typedef struct {...} name;
typedef_struct_pointer #: typedef struct {...} *name;
generate print
define c_import #: Top-level C import object
record
defines vector[c_define] #: List of #define directives
enumerations vector[c_enumeration] #: List of enumeration types
import_logical logical #: {true}=>import logical module
import_out_stream logical #: {true}=>import out_stream module
import_string logical #: {true}=>import string module
import_system logical #: {true}=>import system module
import_table logical #: {true}=>import table module
imports vector[string] #: List of imported modules
includes vector[string] #: Included strings
include_paths vector[string] #: Include directory paths
module_name string #: STIPPLE module name
records vector[c_record] #: All defined records
type_character c_sub_type #: Character type
type_logical c_sub_type #: Logical type
type_integer c_sub_type #: Integer type
type_short_integer c_sub_type #: Short integer type
type_short_unsigned c_sub_type #: Short unsigned integer type
type_string c_sub_type #: C string type
type_unsigned c_sub_type #: Unsigned type
generate allocate, erase, print
define c_options #: Options used
record
includes vector[string] #: -I <include_file>
output_file_name string #: -o <output_file_name>
c_generate logical #: -c (generate C file)
stipple_generate logical #: -s (generate STIPPLE file)
generate allocate, erase, print
define c_record #: C/STIPPLE struct/record
record
c_name string #: The C name of the struct
external logical #: {true}=>emit an extern record
fields vector[c_field] #: The fields of the struct/record
generate_print logical #: {true}=>generate print procedure
generate_new logical #: {true}=>generate new procedure
kind c_kind #: Kind of C struct/typedef
records vector[c_record] #: Records defined
stipple_comment string #: The STIPPLE comment for the record
stipple_name string #: The STIPPLE name of the record
generate allocate, erase, print
define c_sub_type #: C/STIPPLE type
variant kind c_type_kind
character null #: 8-bit unsigned character
integer null #: Signed integer
logical null #: Logical/bool type
opaque c_bind #: Type is opque
pointer c_bind #: Type is a pointer
short_integer null #: Short integer
short_unsigned null #: Unsigend short
string null #: Type is a C string
unsigned null #: Unsigned integer
generate allocate, erase, print
#: {c_enumeration} routines:
procedure c_initial_generate@c_enumeration
takes
enumeration c_enumeration
c_stream out_stream
returns_nothing
#: This procedure will generate the initial object declaration
#, for the C type associated with {enumeration}.
procedure c_initialize_generate@c_enumeration
takes
enumeration c_enumeration
c_stream out_stream
returns_nothing
#: This procedure will generate the initialization routine for
#: the C type associated with {enumeration}.
procedure c_unsigned_convert_generate@c_enumeration
takes
enumeration c_enumeration
c_stream out_stream
returns_nothing
#: This procedure will generate the unsigned converstion routine
#, for the C type associated with {enumeration}.
procedure c_value_get_generate@c_enumeration
takes
enumeration c_enumeration
c_stream out_stream
returns_nothing
#: This procedure will generate the c_value_get routine for {enumeration}
#, to {c_stream}.
procedure format@c_enumeration
takes
enumeration c_enumeration
out_stream out_stream
format string
offset unsigned
returns_nothing
#: This procedure will output {enumeration} to {out_stream}.
procedure item_append@c_enumeration
takes
enumeration c_enumeration
c_name string
stipple_name string
stipple_comment string
returns_nothing
#: This procedure will add the enumeration item binding of {c_name}
#, {stipple_name} to {enumeration}. {stipple_comment} will appear
#, in the generated STIPPLE code next to the item name.
procedure stipple_convert_generate@c_enumeration
takes
enumeration c_enumeration
stipple_stream out_stream
returns_nothing
#: This procedure will output a procedure for convert the C enumeration
#, co-type into the STIPPLE co-type.
procedure stipple_define_generate@c_enumeration
takes
enumeration c_enumeration
stipple_stream out_stream
returns_nothing
#: This procedure will output a declaration for {enumeration} to
#, {stipple_stream).
procedure stipple_equal_generate@c_enumeration
takes
enumeration c_enumeration
stipple_stream out_stream
returns_nothing
#: This procedure will output the equal procedure for the C enumeration
#, co-type associated with {enumeration} to {stipple_stream}.
procedure stipple_hash_generate@c_enumeration
takes
enumeration c_enumeration
stipple_stream out_stream
returns_nothing
#: This procedure will output the hash procedure for the C enumeration
#, co-type associated with {enumeration} to {stipple_stream}.
procedure stipple_print_generate@c_enumeration
takes
enumeration c_enumeration
stipple_stream out_stream
returns_nothing
#: This procedure will output a procedure for printing the C enumeration
#, co-type associated with {enumeration} to {stipple_stream}.
procedure stipple_unsigned_convert_generate@c_enumeration
takes
enumeration c_enumeration
stipple_stream out_stream
returns_nothing
#: This procedure will output the {unsigned_convert} declaration for
#, the C enumeration co-type associated with {enumeration} to
#, {stipple_stream}.
#: {c_field} routines:
procedure stipple_get_generate@c_field
takes
field c_field
record c_record
stipple_stream out_stream
returns_nothing
#: This procedure will output the STIPPLE procedure declaration for
#, the for {field}_get procedure.
procedure stipple_set_generate@c_field
takes
field c_field
record c_record
stipple_stream out_stream
returns_nothing
#: This procedure will output the STIPPLE procedure declaration for
#, the for {field}_set procedure.
#: {c_import} routines:
procedure c_generate@c_import
takes
c_import c_import
c_stream out_stream
returns_nothing
#: This procedure will output the C code associated with {c_import}
#, to {c_stream}.
procedure create@c_import
takes
module_name string
returns c_import
#: This procedure will create and return a {c_import} object
#, with a module name of {module_name}.
procedure define_append@c_import
takes
c_import c_import
c_name string
value string
returns_nothing
#: This procedure will append a #define directive the the #define
#, directive list in {c_import}. THe #define will have a name of
#, {c_name} and a value of {value}.
procedure import_append@c_import
takes
c_import c_import
import_name string
returns_nothing
#: This procedure will add {import_name} to the imports list in {c_import}.
procedure import_standard@c_import
takes
c_import c_import
returns_nothing
#: This procedure will append a bunch of standard modules to imports list
#, {c_import}.
procedure include_append@c_import
takes
c_import c_import
include_name string
returns_nothing
#: This procedure will append {include_name} to the inlcude list in
#, {c_import}. In ANSI-C, there are two syntaxes for include statements --
#, file names enclosed in double quotes and file names enclosed in
#, angle brackets. An angle bracket include file is specified by
#, making the first and last character of {include_name} be "<" and
#, ">", respectively; otherwise the include name will be enclosed
#, in double quotes. It is incorrect to add double quotes to
#, {include_name}.
procedure include_path_append@c_import
takes
c_import c_import
include_path string
returns_nothing
#: This procedure will append {include_path} to the include directory
#, path list in {c_import}.
procedure procedure0_append@c_import
takes
c_import c_import
c_name string
stipple_name string
stipple_type string
return_type c_sub_type
comment string
returns_nothing
#: This procedure will ...
procedure procedure1_append@c_import
takes
c_import c_import
c_name string
stipple_name string
stipple_type string
return_type c_sub_type
argument1_name string
argument1_type c_sub_type
comment string
returns_nothing
#: This procedure will ...
procedure procedure2_append@c_import
takes
c_import c_import
c_name string
stipple_name string
stipple_type string
return_type c_sub_type
argument1_name string
argument1_type c_sub_type
argument2_name string
argument2_type c_sub_type
comment string
returns_nothing
#: This procedure will ...
procedure process@c_import
takes
c_import c_import
program_name string
system system
returns logical
#: This procedure will process any command line options in {system} and
#, output any files requested by the options using {c_import}. {true}
#, is returned if there are any errors; otherwise, {false} is returned.
procedure stipple_generate@c_import
takes
c_import c_import
stipple_stream out_stream
returns_nothing
#: This procedure will output the C code associated with {c_import}
#, to {stipple_stream}.
#: {c_record} routines:
procedure c_get_set_generate@c_record
takes
record c_record
c_stream out_stream
returns_nothing
#: This procedure will generate the C get/set procedure declarations
#, for each field in {record} and output them to {c_stream}.
procedure c_allocate_generate@c_record
takes
record c_record
c_stream out_stream
returns_nothing
#: This procedure will generate the C allocation routine for {record}
#, and output it to {c_stream}.
procedure c_offset_verify_generate@c_record
takes
record c_record
c_stream out_stream
returns_nothing
#: This procedure will output verification code to {c_stream} that will
#, verify that each field in the C version of {record} has the exact
#, same offset as the the STIPPLE version of {record}.
procedure c_print_generate@c_record
takes
record c_record
c_stream out_stream
returns_nothing
#: This procedure will generate the C print routine for {record}
#, and output it to {c_stream}.
procedure c_struct_generate@c_record
takes
record c_record
c_stream out_stream
returns_nothing
#: This procedure will output the C structure for {record} to {c_stream}.
procedure enumeration_create@c_import
takes
c_import c_import
kind c_kind
c_name string
stipple_name string
stipple_comment string
stipple_co_type string
returns c_enumeration
#: This procedure will create and return a {c_enumeration} object
#, allocated from {c_import}. The C type name will be {c_name}
#, and be of {kind} {enum}, {typedef_eum}, or {defines}. There will
#, be either one or two STIPPLE types depending upon whether there
#, is an exact match between the STIPPLE item values and the C item
#, values. If there is an exact match of item values, the C enum type
#, is indistinguishable from the STIPPLE enumeration type and only
#, one STIPPLE type is needed. The one type case is specified by
#, having {stipple_co_type} be the empty string. Conversely, if the
#, item values do not exactly match, two STIPPLE types are needed.
#, One type represents the C enum values ({stipple_co_type}) and the
#, other type represents the the enumeration value after it has been
#, converted to the {stipple_name} type.
procedure format@c_record
takes
record c_record
out_stream out_stream
format string
offset unsigned
returns_nothing
#: This procedure will output {record} to {out_stream}.
procedure record_create@c_import
takes
c_import c_import
kind c_kind
c_name string
stipple_name string
stipple_comment string
external logical
generate_print logical
generate_new logical
returns c_record
#: This procedure will create and return a {c_record} object allocated
#, from {c_import} of type {kind}. The struct name in the ANSI-C code
#, will be {c_name} and the record name in STIPPLE will be
#, {stipple}. If {stipple_comment} is not empty and starts with
#, a "#" character, {stipple_comment} will be appended as a comment
#, to the end of {define} clause. If {external} is {true}, all
#, accesses to the C structure are done through get and set procedures;
#, otherwise, if {external} is {false}, both the order and size
#, of the field names in the C struct exactly match corresponding
#, field names in the STIPPLE record. If {generate_print} is {true}
#, a print procedure is generated. If {generate_new} is {true} an
#, allocation procedure is generated.
procedure field_append@c_record
takes
record c_record
c_name string
c_sub_type c_sub_type
stipple_name string
stipple_comment string
generate_get logical
generate_set logical
returns_nothing
#: This procedure will add a field to {record} with a ANSI-C name
#, of {c_name} and an ANSI-C type extracted from {c_sub_type}. The
#, corresponding field name in the STIPPLE code will be {stipple_name}.
#, If {stipple_name} is empty, {c_name} is used in its stead.
#, If the first character in {stipple_comment} is a "#", {stipple_comment}
#, will be output immediately after the field name in the STIPPLE code.
#, If {generate_get} is {true}, a get routine will be generated.
#, If {generate_set} is {true}, a set routine will be generated.
procedure stipple_define_generate@c_record
takes
record c_record
stipple_stream out_stream
returns_nothing
#: This procedure will output the {define} declaration for {record}
#, to {stipple_stream}.
#: {c_sub_type} routines:
procedure pointer_create@c_sub_type
takes
c_name string
stipple_name string
returns c_sub_type
#: This procedure will create and return a {c_sub_type} containing
#, the {c_name} to {stipple_name} binding.
procedure format@c_sub_type
takes
c_sub_type c_sub_type
out_stream out_stream
format string
offset unsigned
returns_nothing
#: This procedure will output {c_sub_type} to {out_stream}.