PIPS
|
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "genC.h"
#include "newgen_include.h"
Go to the source code of this file.
Macros | |
#define | FIELD "" /**was: "field_" */ |
#define | STRUCT "_newgen_struct_" /**structure names */ |
#define | OPTIMIZE_NEWGEN "OPTIMIZE_NEWGEN" |
#define | IS_TAB(x) ((x)==Tabulated_bp) |
#define | TYPE(bp) (bp-Domains-Number_imports-Current_start) |
non user domain must be taken care from outside? More... | |
#define | DomainNumberError |
#define | same_size(t) (sizeof(t)==sizeof(gen_chunk)) |
#define | DONT_TOUCH |
Functions | |
static int | sharp_ifopt (FILE *out) |
Might be used to generate optimized versions (say macros instead of functions). More... | |
static int | sharp_else (FILE *out) |
static int | sharp_endif (FILE *out) |
int | gen_size (int domain) |
GEN_SIZE returns the size (in gen_chunks) of an object of type defined by the BP type. More... | |
static string | strup (string s) |
returns s duplicated and case-uppered. More... | |
static bool | inline_directly (union domain *dp) |
static string | int_type (void) |
bof... More... | |
static string | int_type_access_complement (void) |
static string | newgen_type_name (union domain *dp) |
newgen type name for holder. More... | |
static string | newgen_argument_type_name (union domain *dp) |
C type name for generated function arguments. More... | |
static string | newgen_type_name_close (union domain *dp) |
static char | newgen_access_name (union domain *dp) |
what to add to the field to access a given primitive type, which was typically declared as a gen_chunk. More... | |
static string | newgen_kind_label (union domain *dp) |
just to generate comprehensive comments. More... | |
static void | generate_make (FILE *header, FILE *code, struct gen_binding *bp, int domain_type, int operator) |
make is bigger, thus I put it in a separate function. More... | |
static void | generate_struct_members (FILE *out, struct gen_binding *bp, int domain_type, int operator) |
generate the struct for bp. More... | |
static void | generate_union_type_descriptor (FILE *out, struct gen_binding *bp, int domain_type, int operator) |
static void | generate_union_as_string (FILE *header, FILE *code, struct gen_binding *bp, int domain_type, int operator) |
introspection function. More... | |
static void | generate_access_members (FILE *out, struct gen_binding *bp, int domain_type, int operator) |
access to members are managed thru macros. More... | |
static void | generate_constructed (FILE *header, FILE *code, struct gen_binding *bp, int operator) |
constructed types: + x (and ->...) More... | |
static void | generate_not_constructed (FILE *header, FILE *code, struct gen_binding *bp, int domain_type) |
other types (direct * {} []) More... | |
static void | generate_arrow (FILE *header, FILE *code, struct gen_binding *bp) |
newgen function (->) specific stuff More... | |
static void | generate_safe_definition (FILE *out, struct gen_binding *bp, string file) |
generates a needed type declaration. More... | |
static void | generate_domain (FILE *header, FILE *code, struct gen_binding *bp) |
generate the needed stuff for bp. More... | |
static FILE * | fopen_suffix (string prefix, string suffix) |
fopen prefix + suffix. More... | |
void | gencode (string file) |
generate the code necessary to manipulate every internal non-inlinable type in the Domains table. More... | |
#define DomainNumberError |
#define DONT_TOUCH |
#define IS_TAB | ( | x | ) | ((x)==Tabulated_bp) |
#define TYPE | ( | bp | ) | (bp-Domains-Number_imports-Current_start) |
GEN_SIZE returns the size (in gen_chunks) of an object of type defined by the BP type.
to avoid a gcc warning
OTREACHED
Definition at line 71 of file genC.c.
References AND_OP, ARRAY_DT, ARROW_OP, domain::ba, BASIS_DT, domain::co, domain::components, CONSTRUCTED_DT, gen_binding::domain, Domains, fatal(), GEN_HEADER, i2a(), IS_TABULATED, LIST_DT, domain::op, OR_OP, SET_DT, gen_binding::size, and domain::type.
Referenced by allocated_memory_obj_in(), compile(), copy_obj_in(), gen_enter_tabulated(), and generate_make().
void gencode | ( | string | file | ) |
generate the code necessary to manipulate every internal non-inlinable type in the Domains table.
header = fopen_suffix(file, ".h");
first generate protected forward declarations.
then generate actual declarations.
fclose(header);
Definition at line 928 of file genC.c.
References Domains, DONT_TOUCH, fatal(), fopen_suffix(), fprintf(), generate_domain(), generate_safe_definition(), IS_EXTERNAL, IS_IMPORT, IS_INLINABLE, IS_TAB, MAX_DOMAIN, gen_binding::name, sharp_else(), sharp_endif(), and sharp_ifopt().
Referenced by build().
|
static |
access to members are managed thru macros.
cannot be functions because assign would not be possible. it would be better to avoid having field names that appear twice...
accesses...
Definition at line 490 of file genC.c.
References ARRAY_DT, ARROW_OP, domain::ba, domain::co, domain::components, CONSTRUCTED_DT, domain::constructor, gen_binding::domain, FIELD, fprintf(), inline_directly(), int_type_access_complement(), LIST_DT, gen_binding::name, newgen_access_name(), OR_OP, out, and SET_DT.
Referenced by generate_constructed(), and generate_not_constructed().
|
static |
newgen function (->) specific stuff
how to extract the key and value from the hash_table chunks.
apply
update
extend
delete
bound_p
Definition at line 585 of file genC.c.
References domain::co, domain::components, gen_binding::domain, fprintf(), free(), gen_binding::name, newgen_access_name(), newgen_argument_type_name(), and strup().
Referenced by generate_domain().
|
static |
constructed types: + x (and ->...)
Definition at line 555 of file genC.c.
References CONSTRUCTED_DT, fprintf(), generate_access_members(), generate_make(), generate_struct_members(), generate_union_as_string(), and generate_union_type_descriptor().
Referenced by generate_domain().
|
static |
generate the needed stuff for bp.
assumes a preceeding safe definition. non specific (and/or...) stuff.
what about assignment with checks? something like: #define FOO_assign(r,v) \ { FOO * _p = &(r), _v = (v); \ FOO_check(r); FOO_check(v); \ *_p = _v; \ }
tabulated
find
write
read
find
write
read
NOT tabulated
write
read
write
read
nothing to generate at the time.
Definition at line 711 of file genC.c.
References AND_OP, ARRAY_DT, ARROW_OP, domain::ba, domain::co, CONSTRUCTED_DT, gen_binding::domain, DomainNumberError, EXTERNAL_DT, fatal(), fprintf(), free(), generate_arrow(), generate_constructed(), generate_not_constructed(), IS_EXTERNAL, IS_TABULATED, LIST_DT, gen_binding::name, domain::op, OR_OP, SET_DT, STRUCT, strup(), and domain::type.
Referenced by gencode().
|
static |
make is bigger, thus I put it in a separate function.
HEADER
CODE
additionnal constructors for OR, so as to improve type checking.
check for unit...
UNIT case
header
code
header
code
Definition at line 228 of file genC.c.
References AND_OP, ARRAY_DT, ARROW_OP, domain::co, domain::components, CONSTRUCTED_DT, gen_binding::domain, Domains, fatal(), fprintf(), gen_size(), LIST_DT, gen_binding::name, newgen_argument_type_name(), newgen_type_name_close(), OR_OP, SET_DT, and UNIT_TYPE_NAME.
Referenced by generate_constructed(), and generate_not_constructed().
|
static |
other types (direct * {} [])
Definition at line 571 of file genC.c.
References fprintf(), generate_access_members(), generate_make(), generate_struct_members(), and UNDEF_OP.
Referenced by generate_domain().
|
static |
generates a needed type declaration.
kind of a bug here: if the very same externals appears several times, they are not sure to be attributed the same number in different files with different include orders. externals should really be global?
should not run if IS_IMPORT(bp)???
Definition at line 661 of file genC.c.
References fprintf(), free(), IS_EXTERNAL, IS_IMPORT, gen_binding::name, out, STRUCT, strup(), and TYPE.
Referenced by gencode().
|
static |
generate the struct for bp.
generate the structure
there is an additionnal field in tabulated domains.
generate struct fields
Definition at line 370 of file genC.c.
References ARROW_OP, domain::co, domain::components, CONSTRUCTED_DT, gen_binding::domain, FIELD, fprintf(), int_type(), IS_TABULATED, LIST_DT, gen_binding::name, newgen_kind_label(), newgen_type_name(), newgen_type_name_close(), offset, OR_OP, out, SET_DT, and STRUCT.
Referenced by generate_constructed(), and generate_not_constructed().
|
static |
introspection function.
could be a dynamic function in genClib...
Definition at line 454 of file genC.c.
References domain::co, domain::components, CONSTRUCTED_DT, gen_binding::domain, fprintf(), gen_binding::name, and OR_OP.
Referenced by generate_constructed().
|
static |
Definition at line 428 of file genC.c.
References domain::co, domain::components, CONSTRUCTED_DT, gen_binding::domain, fprintf(), gen_binding::name, OR_OP, and out.
Referenced by generate_constructed().
Definition at line 119 of file genC.c.
References domain::ba, BASIS_DT, domain::constructand, intptr_t, IS_INLINABLE, gen_binding::name, same_size, same_string_p, and domain::type.
Referenced by generate_access_members(), and newgen_type_name().
|
static |
bof...
Definition at line 135 of file genC.c.
References intptr_t, and same_size.
Referenced by generate_struct_members(), newgen_argument_type_name(), and newgen_type_name().
|
static |
|
static |
what to add to the field to access a given primitive type, which was typically declared as a gen_chunk.
the field is the first char of the type name.
Definition at line 206 of file genC.c.
References domain::ba, BASIS_DT, domain::constructand, IS_INLINABLE, gen_binding::name, and domain::type.
Referenced by generate_access_members(), and generate_arrow().
C type name for generated function arguments.
Even if the NewGen name is int, the C name can be intptr_t:
Definition at line 179 of file genC.c.
References domain::ar, ARRAY_DT, domain::ba, BASIS_DT, domain::constructand, domain::element, fatal(), int_type(), LIST_DT, gen_binding::name, same_string_p, SET_DT, and domain::type.
Referenced by generate_arrow(), and generate_make().
just to generate comprehensive comments.
Definition at line 216 of file genC.c.
References ARRAY_DT, domain::ba, LIST_DT, SET_DT, and domain::type.
Referenced by generate_struct_members().
newgen type name for holder.
could/should always be gen_chunk?
Even if the NewGen name is int, the C name can be intptr_t:
FALLTHRU
Definition at line 148 of file genC.c.
References domain::ar, ARRAY_DT, ARROW_OP, domain::ba, BASIS_DT, domain::co, domain::constructand, CONSTRUCTED_DT, domain::element, fatal(), inline_directly(), int_type(), IS_INLINABLE, LIST_DT, gen_binding::name, domain::op, same_string_p, SET_DT, and domain::type.
Referenced by generate_struct_members().
pointer
Definition at line 196 of file genC.c.
References ARRAY_DT, domain::ba, and domain::type.
Referenced by generate_make(), and generate_struct_members().
|
static |
|
static |
|
static |
returns s duplicated and case-uppered.
Definition at line 110 of file genC.c.
References strdup().
Referenced by generate_arrow(), generate_domain(), and generate_safe_definition().