export memory allocation functions

This commit is contained in:
Alexey Fedoseev
2024-04-13 12:37:38 +03:00
parent 65e1a88681
commit ab13bbf4b1
2 changed files with 93 additions and 30 deletions

View File

@@ -326,7 +326,7 @@ static const size_t yed_graphml_keys_count = sizeof(yed_graphml_keys) / sizeof(G
* Utility functions * Utility functions
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
static int cyberiada_copy_string(char** target, size_t* size, const char* source) int cyberiada_copy_string(char** target, size_t* size, const char* source)
{ {
char* target_str; char* target_str;
size_t strsize; size_t strsize;
@@ -432,14 +432,14 @@ static CyberiadaEdge* cyberiada_graph_find_edge_by_id(CyberiadaEdge* root, const
return NULL; return NULL;
} }
static CyberiadaCommentData* cyberiada_new_comment_data(void) CyberiadaCommentData* cyberiada_new_comment_data(void)
{ {
CyberiadaCommentData* cd = (CyberiadaCommentData*)malloc(sizeof(CyberiadaCommentData)); CyberiadaCommentData* cd = (CyberiadaCommentData*)malloc(sizeof(CyberiadaCommentData));
memset(cd, 0, sizeof(CyberiadaCommentData)); memset(cd, 0, sizeof(CyberiadaCommentData));
return cd; return cd;
} }
static CyberiadaLink* cyberiada_new_link(const char* ref) CyberiadaLink* cyberiada_new_link(const char* ref)
{ {
CyberiadaLink* link = (CyberiadaLink*)malloc(sizeof(CyberiadaLink)); CyberiadaLink* link = (CyberiadaLink*)malloc(sizeof(CyberiadaLink));
memset(link, 0, sizeof(CyberiadaLink)); memset(link, 0, sizeof(CyberiadaLink));
@@ -447,7 +447,7 @@ static CyberiadaLink* cyberiada_new_link(const char* ref)
return link; return link;
} }
static CyberiadaNode* cyberiada_new_node(const char* id) CyberiadaNode* cyberiada_new_node(const char* id)
{ {
CyberiadaNode* new_node = (CyberiadaNode*)malloc(sizeof(CyberiadaNode)); CyberiadaNode* new_node = (CyberiadaNode*)malloc(sizeof(CyberiadaNode));
memset(new_node, 0, sizeof(CyberiadaNode)); memset(new_node, 0, sizeof(CyberiadaNode));
@@ -513,7 +513,7 @@ static int cyberiada_destroy_all_nodes(CyberiadaNode* node)
return CYBERIADA_NO_ERROR; return CYBERIADA_NO_ERROR;
} }
static CyberiadaCommentSubject* cyberiada_new_comment_subject(CyberiadaCommentSubjectType type) CyberiadaCommentSubject* cyberiada_new_comment_subject(CyberiadaCommentSubjectType type)
{ {
CyberiadaCommentSubject* cs = (CyberiadaCommentSubject*)malloc(sizeof(CyberiadaCommentSubject)); CyberiadaCommentSubject* cs = (CyberiadaCommentSubject*)malloc(sizeof(CyberiadaCommentSubject));
memset(cs, 0, sizeof(CyberiadaCommentSubject)); memset(cs, 0, sizeof(CyberiadaCommentSubject));
@@ -521,7 +521,7 @@ static CyberiadaCommentSubject* cyberiada_new_comment_subject(CyberiadaCommentSu
return cs; return cs;
} }
static CyberiadaEdge* cyberiada_new_edge(const char* id, const char* source, const char* target) CyberiadaEdge* cyberiada_new_edge(const char* id, const char* source, const char* target)
{ {
CyberiadaEdge* new_edge = (CyberiadaEdge*)malloc(sizeof(CyberiadaEdge)); CyberiadaEdge* new_edge = (CyberiadaEdge*)malloc(sizeof(CyberiadaEdge));
memset(new_edge, 0, sizeof(CyberiadaEdge)); memset(new_edge, 0, sizeof(CyberiadaEdge));
@@ -532,7 +532,28 @@ static CyberiadaEdge* cyberiada_new_edge(const char* id, const char* source, con
return new_edge; return new_edge;
} }
static CyberiadaAction* cyberiada_new_action(CyberiadaActionType type, CyberiadaPoint* cyberiada_new_point(void)
{
CyberiadaPoint* p = (CyberiadaPoint*)malloc(sizeof(CyberiadaPoint));
memset(p, 0, sizeof(CyberiadaPoint));
return p;
}
CyberiadaRect* cyberiada_new_rect(void)
{
CyberiadaRect* r = (CyberiadaRect*)malloc(sizeof(CyberiadaRect));
memset(r, 0, sizeof(CyberiadaRect));
return r;
}
CyberiadaPolyline* cyberiada_new_polyline(void)
{
CyberiadaPolyline* pl = (CyberiadaPolyline*)malloc(sizeof(CyberiadaPolyline));
memset(pl, 0, sizeof(CyberiadaPolyline));
return pl;
}
CyberiadaAction* cyberiada_new_action(CyberiadaActionType type,
const char* trigger, const char* trigger,
const char* guard, const char* guard,
const char* behavior) const char* behavior)
@@ -1226,14 +1247,14 @@ static int cyberiada_init_sm(CyberiadaSM* sm)
return CYBERIADA_NO_ERROR; return CYBERIADA_NO_ERROR;
} }
static CyberiadaSM* cyberiada_create_sm(void) CyberiadaSM* cyberiada_new_sm(void)
{ {
CyberiadaSM* sm = (CyberiadaSM*)malloc(sizeof(CyberiadaSM)); CyberiadaSM* sm = (CyberiadaSM*)malloc(sizeof(CyberiadaSM));
cyberiada_init_sm(sm); cyberiada_init_sm(sm);
return sm; return sm;
} }
CyberiadaDocument* cyberiada_create_sm_document(void) CyberiadaDocument* cyberiada_new_sm_document(void)
{ {
CyberiadaDocument* doc = (CyberiadaDocument*)malloc(sizeof(CyberiadaDocument)); CyberiadaDocument* doc = (CyberiadaDocument*)malloc(sizeof(CyberiadaDocument));
cyberiada_init_sm_document(doc); cyberiada_init_sm_document(doc);
@@ -1448,7 +1469,7 @@ static int cyberiada_xml_read_coord(xmlNode* xml_node,
static int cyberiada_xml_read_point(xmlNode* xml_node, static int cyberiada_xml_read_point(xmlNode* xml_node,
CyberiadaPoint** point) CyberiadaPoint** point)
{ {
CyberiadaPoint* p = (CyberiadaPoint*)malloc(sizeof(CyberiadaPoint)); CyberiadaPoint* p = cyberiada_new_point();
if (cyberiada_xml_read_coord(xml_node, if (cyberiada_xml_read_coord(xml_node,
GRAPHML_GEOM_X_ATTRIBUTE, GRAPHML_GEOM_X_ATTRIBUTE,
&(p->x))) { &(p->x))) {
@@ -1466,7 +1487,7 @@ static int cyberiada_xml_read_point(xmlNode* xml_node,
static int cyberiada_xml_read_rect(xmlNode* xml_node, static int cyberiada_xml_read_rect(xmlNode* xml_node,
CyberiadaRect** rect) CyberiadaRect** rect)
{ {
CyberiadaRect* r = (CyberiadaRect*)malloc(sizeof(CyberiadaRect)); CyberiadaRect* r = cyberiada_new_rect();
if (cyberiada_xml_read_coord(xml_node, if (cyberiada_xml_read_coord(xml_node,
GRAPHML_GEOM_X_ATTRIBUTE, GRAPHML_GEOM_X_ATTRIBUTE,
&(r->x)) != CYBERIADA_NO_ERROR) { &(r->x)) != CYBERIADA_NO_ERROR) {
@@ -1513,7 +1534,7 @@ static GraphProcessorState handle_new_graph(xmlNode* xml_node,
while (sm->next) sm = sm->next; while (sm->next) sm = sm->next;
if (parent == NULL) { if (parent == NULL) {
if (sm->nodes != NULL) { if (sm->nodes != NULL) {
sm->next = cyberiada_create_sm(); sm->next = cyberiada_new_sm();
sm = sm->next; sm = sm->next;
} }
sm->nodes = cyberiada_new_node(buffer); sm->nodes = cyberiada_new_node(buffer);
@@ -1602,8 +1623,7 @@ static GraphProcessorState handle_edge_point(xmlNode* xml_node,
if (cyberiada_xml_read_point(xml_node, &p) != CYBERIADA_NO_ERROR) { if (cyberiada_xml_read_point(xml_node, &p) != CYBERIADA_NO_ERROR) {
return gpsInvalid; return gpsInvalid;
} }
pl = (CyberiadaPolyline*)malloc(sizeof(CyberiadaPolyline)); pl = cyberiada_new_polyline();
memset(pl, 0, sizeof(CyberiadaPolyline));
pl->point.x = p->x; pl->point.x = p->x;
pl->point.y = p->y; pl->point.y = p->y;
free(p); free(p);
@@ -1694,7 +1714,7 @@ static GraphProcessorState handle_node_geometry(xmlNode* xml_node,
return gpsInvalid; return gpsInvalid;
} }
if (type == cybNodeInitial) { if (type == cybNodeInitial) {
current->geometry_point = (CyberiadaPoint*)malloc(sizeof(CyberiadaPoint)); current->geometry_point = cyberiada_new_point();
current->geometry_point->x = rect->x + rect->width / 2.0f; current->geometry_point->x = rect->x + rect->width / 2.0f;
current->geometry_point->y = rect->y + rect->height / 2.0f; current->geometry_point->y = rect->y + rect->height / 2.0f;
free(rect); free(rect);
@@ -1796,8 +1816,8 @@ static GraphProcessorState handle_edge_geometry(xmlNode* xml_node,
ERROR("no current edge\n"); ERROR("no current edge\n");
return gpsInvalid; return gpsInvalid;
} }
current->geometry_source_point = (CyberiadaPoint*)malloc(sizeof(CyberiadaPoint)); current->geometry_source_point = cyberiada_new_point();
current->geometry_target_point = (CyberiadaPoint*)malloc(sizeof(CyberiadaPoint)); current->geometry_target_point = cyberiada_new_point();
if (cyberiada_xml_read_coord(xml_node, if (cyberiada_xml_read_coord(xml_node,
GRAPHML_YED_GEOM_SOURCE_X_ATTRIBUTE, GRAPHML_YED_GEOM_SOURCE_X_ATTRIBUTE,
&(current->geometry_source_point->x)) != CYBERIADA_NO_ERROR || &(current->geometry_source_point->x)) != CYBERIADA_NO_ERROR ||
@@ -1957,6 +1977,19 @@ static MetainfoDeclaration cyberiada_metadata[] = {
} }
}; };
CyberiadaMetainformation* cyberiada_new_meta(void)
{
CyberiadaMetainformation* meta = (CyberiadaMetainformation*)malloc(sizeof(CyberiadaMetainformation));
memset(meta, 0, sizeof(CyberiadaMetainformation));
cyberiada_copy_string(&(meta->standard_version),
&(meta->standard_version_len),
CYBERIADA_STANDARD_VERSION_CYBERIADAML);
meta->transition_order_flag = 1;
meta->event_propagation_flag = 1;
return meta;
}
static int cyberiada_add_default_meta(CyberiadaDocument* doc, const char* sm_name) static int cyberiada_add_default_meta(CyberiadaDocument* doc, const char* sm_name)
{ {
CyberiadaMetainformation* meta; CyberiadaMetainformation* meta;
@@ -1965,18 +1998,12 @@ static int cyberiada_add_default_meta(CyberiadaDocument* doc, const char* sm_nam
return CYBERIADA_BAD_PARAMETER; return CYBERIADA_BAD_PARAMETER;
} }
meta = (CyberiadaMetainformation*)malloc(sizeof(CyberiadaMetainformation)); meta = cyberiada_new_meta();
memset(meta, 0, sizeof(CyberiadaMetainformation));
cyberiada_copy_string(&(meta->standard_version),
&(meta->standard_version_len),
CYBERIADA_STANDARD_VERSION_CYBERIADAML);
if (*sm_name) { if (*sm_name) {
cyberiada_copy_string(&(meta->name), &(meta->name_len), sm_name); cyberiada_copy_string(&(meta->name), &(meta->name_len), sm_name);
} }
meta->transition_order_flag = 1;
meta->event_propagation_flag = 1;
doc->meta_info = meta; doc->meta_info = meta;
return CYBERIADA_NO_ERROR; return CYBERIADA_NO_ERROR;
@@ -2911,7 +2938,7 @@ int cyberiada_read_sm_document(CyberiadaDocument* cyb_doc, const char* filename,
break; break;
} }
cyb_doc->state_machines = cyberiada_create_sm(); cyb_doc->state_machines = cyberiada_new_sm();
/* DEBUG("reading format %d\n", format); */ /* DEBUG("reading format %d\n", format); */
if (format == cybxmlYED) { if (format == cybxmlYED) {

View File

@@ -244,8 +244,8 @@ typedef enum {
* The Cyberiada GraphML library functions * The Cyberiada GraphML library functions
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
/* Allocate the SM structure in memory (for heap usage) */ /* Allocate the SM document structure in memory (for heap usage) */
CyberiadaDocument* cyberiada_create_sm_document(void); CyberiadaDocument* cyberiada_new_sm_document(void);
/* Initialize the SM structure */ /* Initialize the SM structure */
/* Do not use the structure before the initialization! */ /* Do not use the structure before the initialization! */
@@ -268,6 +268,42 @@ typedef enum {
/* Print the SM structure to stdout */ /* Print the SM structure to stdout */
int cyberiada_print_sm_document(CyberiadaDocument* doc); int cyberiada_print_sm_document(CyberiadaDocument* doc);
/* Allocate and initialize the SM structure in memory */
CyberiadaSM* cyberiada_new_sm(void);
/* Allocate and initialize the SM node structure in memory */
CyberiadaNode* cyberiada_new_node(const char* id);
/* Allocate and initialize the SM edge structure in memory */
CyberiadaEdge* cyberiada_new_edge(const char* id, const char* source, const char* target);
/* Allocate and initialize the SM comment data structure in memory */
CyberiadaCommentData* cyberiada_new_comment_data(void);
/* Allocate and initialize the SM link structure in memory */
CyberiadaLink* cyberiada_new_link(const char* ref);
/* Allocate and initialize the SM comment subject structure in memory */
CyberiadaCommentSubject* cyberiada_new_comment_subject(CyberiadaCommentSubjectType type);
/* Allocate and initialize the SM action structure in memory */
CyberiadaAction* cyberiada_new_action(CyberiadaActionType type, const char* trigger, const char* guard, const char* behavior);
/* Allocate and initialize the SM point structure in memory */
CyberiadaPoint* cyberiada_new_point(void);
/* Allocate and initialize the SM rect structure in memory */
CyberiadaRect* cyberiada_new_rect(void);
/* Allocate and initialize the SM polyline structure in memory */
CyberiadaPolyline* cyberiada_new_polyline(void);
/* Allocate and initialize the SM metainformation structure in memory */
CyberiadaMetainformation* cyberiada_new_meta(void);
/* Initialize and copy string. Use this function to initialize strings in Cyberiada structures */
int cyberiada_copy_string(char** target, size_t* size, const char* source);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif