Browse Source

+ UA_list.c - double linked lists
+ check_list.c
M further test restructuring and suite/testcase separation

Stasik0 11 years ago
parent
commit
b1d461a817
8 changed files with 472 additions and 180 deletions
  1. 5 1
      include/UA_config.h
  2. 71 0
      include/UA_list.h
  3. 2 1
      src/Makefile.am
  4. 3 0
      src/opcua_builtInDatatypes.h
  5. 216 0
      src/util/UA_list.c
  6. 9 8
      tests/Makefile.am
  7. 0 170
      tests/check_main.c
  8. 166 0
      tests/check_stack.c

+ 5 - 1
include/UA_config.h

@@ -1,7 +1,11 @@
 #ifndef UA_CONFIG_H_
 #define UA_CONFIG_H_
 
-#TODO: include all other header files
+//TODO: include all other header files
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "opcua_builtInDatatypes.h"
 #include "UA_abbr.h"
 
 

+ 71 - 0
include/UA_list.h

@@ -0,0 +1,71 @@
+/*
+ * UA_list.h
+ *
+ *  Created on: Mar 13, 2014
+ *      Author: sten
+ */
+
+#ifndef UA_LIST_H_
+#define UA_LIST_H_
+
+#include "opcua_builtInDatatypes.h"
+
+/*
+ * Data Structures
+ */
+typedef void (*UA_list_PayloadVisitor)(void* payload);
+
+/*
+ * Double Linked Lists
+ */
+
+typedef struct T_UA_list_Element {
+	struct T_UA_list_List* father;
+	void *payload;
+    struct T_UA_list_Element* next;
+    struct T_UA_list_Element* prev;
+}UA_list_Element;
+
+typedef struct T_UA_list_List {
+   struct T_UA_list_Element* first;
+   struct T_UA_list_Element* last;
+   Int32 size;
+}UA_list_List;
+
+typedef void (*UA_list_ElementVisitor)(UA_list_Element* payload);
+/*
+ * Returns 1 for true, 0 otherwise
+ */
+typedef Boolean (*UA_list_PayloadMatcher)(void* payload);
+
+Int32 UA_list_initElement(UA_list_Element* const element);
+
+Int32 UA_list_init(UA_list_List* const list);
+
+Int32 UA_list_addElementToFront(UA_list_List* const list, UA_list_Element* const element);
+
+Int32 UA_list_addPayloadToFront(UA_list_List* const list, void* const payload);
+
+Int32 UA_list_addElementToBack(UA_list_List* const list, UA_list_Element* const element);
+
+Int32 UA_list_addPayloadToBack(UA_list_List* const list, void* const payload);
+
+Int32 UA_list_removeFirst(UA_list_List* const list, UA_list_PayloadVisitor visitor);
+
+Int32 UA_list_removeLast(UA_list_List* const list, UA_list_PayloadVisitor visitor);
+
+Int32 UA_list_removeElement(UA_list_Element* const elem, UA_list_PayloadVisitor visitor);
+
+Int32 UA_list_destroy(UA_list_List* const list, UA_list_PayloadVisitor visitor);
+
+Int32 UA_list_iterateElement(UA_list_List* const list, UA_list_ElementVisitor visitor);
+
+Int32 UA_list_iteratePayload(UA_list_List* const list, UA_list_PayloadVisitor visitor);
+
+UA_list_Element* UA_list_find(UA_list_List* const list, UA_list_PayloadMatcher matcher);
+
+UA_list_Element* UA_list_getFirst(UA_list_List* const list);
+
+UA_list_Element* UA_list_getLast(UA_list_List* const list);
+
+#endif /* UA_LIST_H_ */

+ 2 - 1
src/Makefile.am

@@ -18,7 +18,8 @@ libopen62541_la_SOURCES = opcua_builtInDatatypes.c\
 						opcua_secureChannelLayer.h\
 						opcua_memory.h\
 						opcua_time.h\
-						tcp_layer.h						
+						tcp_layer.h\
+						util/UA_list.c						
 libopen62541_la_CFLAGS = -I $(top_builddir)/include
 
 .PHONY: convenience-link clean-convenience-link

+ 3 - 0
src/opcua_builtInDatatypes.h

@@ -9,6 +9,9 @@
 #ifndef OPCUA_BUILTINDATATYPES_H_
 #define OPCUA_BUILTINDATATYPES_H_
 
+#define TRUE (42==42)
+#define FALSE (!TRUE)
+
 /**
 * Enumerations:
 *	All Enumerations should be encoded as Int32 values

+ 216 - 0
src/util/UA_list.c

@@ -0,0 +1,216 @@
+
+#include "UA_config.h"
+#include "UA_list.h"
+
+void UA_list_defaultFreer(void* payload){
+	if(payload){
+		opcua_free(payload);
+	}
+}
+Int32 UA_list_initElement(UA_list_Element* const element){
+	if(element==NULL)return UA_ERROR;
+	element->next=NULL;
+	element->prev=NULL;
+	element->father=NULL;
+	element->payload=NULL;
+	return UA_NO_ERROR;
+}
+
+Int32 UA_list_init(UA_list_List* const list){
+	if(list==NULL)return UA_ERROR;
+	list->first = NULL;
+	list->last = NULL;
+	list->size = 0;
+	return UA_NO_ERROR;
+}
+
+Int32 UA_list_addElementToFront(UA_list_List* const list, UA_list_Element* const element){
+	if(list==NULL || element==NULL)return UA_ERROR;
+	UA_list_Element* second = NULL;
+	second = list->first;
+	list->first = element;
+	element->prev = NULL;
+	element->next = second;
+	element->father = list;
+	if(second){
+		second->prev=element;
+	}
+	list->size++;
+	if(list->size==1){
+		list->last=element;
+	}
+	return UA_NO_ERROR;
+}
+
+Int32 UA_list_addPayloadToFront(UA_list_List* const list, void* const payload){
+	if(list==NULL)return UA_ERROR;
+	UA_list_Element* elem = (UA_list_Element*)opcua_malloc(sizeof(*elem));
+	UA_list_initElement(elem);
+	elem->payload = payload;
+	UA_list_addElementToFront(list, elem);
+	return UA_NO_ERROR;
+}
+
+Int32 UA_list_addElementToBack(UA_list_List* const list, UA_list_Element* const element){
+	if(list==NULL || element == NULL)return UA_ERROR;
+	UA_list_Element* secondLast = NULL;
+	secondLast = list->last;
+	list->last = element;
+	element->prev = secondLast;
+	element->next = NULL;
+	element->father = list;
+	if(secondLast){
+		secondLast->next = element;
+	}
+	list->size++;
+	if(list->size==1){
+		list->first=element;
+	}
+	return UA_NO_ERROR;
+}
+
+Int32 UA_list_addPayloadToBack(UA_list_List* const list, void* const payload){
+	if(list==NULL)return UA_ERROR;
+	UA_list_Element* elem = (UA_list_Element*)opcua_malloc(sizeof(*elem));
+	UA_list_initElement(elem);
+	elem->payload = payload;
+	UA_list_addElementToBack(list, elem);
+	return UA_NO_ERROR;
+}
+
+Int32 UA_list_removeFirst(UA_list_List* const list, UA_list_PayloadVisitor visitor){
+	if(list==NULL)return UA_ERROR;
+	UA_list_Element* temp = NULL;
+	if(list->first){
+		temp = list->first->next;
+		if(visitor){
+			(*visitor)(list->first->payload);
+		}
+		opcua_free(list->first);
+		list->first = temp;
+		list->size--;
+		if(list->size == 1){
+			list->last = temp;
+		}else if(list->size==0){
+			list->last = NULL;
+		}
+	}
+	return UA_NO_ERROR;
+}
+
+Int32 UA_list_removeLast(UA_list_List* const list, UA_list_PayloadVisitor visitor){
+	if(list==NULL)return UA_ERROR;
+	UA_list_Element* temp = NULL;
+	if(list->last){
+		temp = list->last->prev;
+		if(visitor){
+			(*visitor)(list->last->payload);
+		}
+		opcua_free(list->last);
+		list->last = temp;
+		list->size--;
+		if(list->size == 1){
+			list->first = temp;
+		}else if(list->size==0){
+			list->first = NULL;
+		}
+	}
+	return UA_NO_ERROR;
+}
+
+
+Int32 UA_list_removeElement(UA_list_Element* const elem, UA_list_PayloadVisitor visitor){
+	if(elem==NULL)return UA_ERROR;
+	if(elem==elem->father->first){
+		return UA_list_removeFirst(elem->father, visitor);
+	}else if(elem==elem->father->last){
+		return UA_list_removeLast(elem->father, visitor);
+	}else{
+		UA_list_Element* prev = elem->prev;
+		UA_list_Element* next = elem->next;
+		prev->next = next;
+		next->prev = prev;
+		if(visitor){
+			(*visitor)(elem->payload);
+		}
+		(elem->father)->size--;
+		opcua_free(elem);
+	}
+	return UA_NO_ERROR;
+}
+
+Int32 UA_list_destroy(UA_list_List* const list, UA_list_PayloadVisitor visitor){
+	if(list==NULL)return UA_ERROR;
+	UA_list_Element* current = NULL;
+	current=list->first;
+	while(current){
+		UA_list_Element* next = current->next;
+		if(visitor){
+			(*visitor)(current->payload);
+		}
+		opcua_free(current);
+		current = next;
+	}
+	UA_list_init(list);
+	return UA_NO_ERROR;
+}
+
+Int32 UA_list_iterateElement(UA_list_List* const list, UA_list_ElementVisitor visitor){
+	if(list==NULL)return UA_ERROR;
+	UA_list_Element* current = list->first;
+	while(current){
+		if(visitor){
+			(*visitor)(current);
+		}
+		current=current->next;
+	}
+	return UA_NO_ERROR;
+}
+
+/*Int32 UA_list_iteratePayload(UA_list_list* const list, UA_payloadVisitor visitor){
+	void visitorTemp(UA_list_element* element){
+		if(visitor){
+			(*visitor)(element->payload);
+		}
+	}
+	if(list==NULL)return UA_ERROR;
+	UA_list_iterateElement(list, visitorTemp);
+	return UA_NO_ERROR;
+}*/
+/** ANSI C forbids function nesting - reworked ugly version **/
+Int32 UA_list_iteratePayload(UA_list_List* const list, UA_list_PayloadVisitor visitor){
+	if(list==NULL)return UA_ERROR;
+	UA_list_Element* current = list->first;
+	while(current){
+		if(visitor){
+			(*visitor)(current->payload);
+		}
+		current=current->next;
+	}
+	return UA_NO_ERROR;
+}
+
+UA_list_Element* UA_list_find(UA_list_List* const list, UA_list_PayloadMatcher matcher){
+	if(list==NULL)return NULL;
+	if(matcher){
+		UA_list_Element* current = list->first;
+		while(current){
+			if(matcher && (*matcher)(current->payload)==TRUE){
+				return current;
+			}
+			current=current->next;
+		}
+	}
+	/* nothing found */
+	return NULL;
+}
+
+UA_list_Element* UA_list_getFirst(UA_list_List* const list){
+	if(list==NULL)return NULL;
+	return list->first;
+}
+
+UA_list_Element* UA_list_getLast(UA_list_List* const list){
+	if(list==NULL)return NULL;
+	return list->last;
+}

+ 9 - 8
tests/Makefile.am

@@ -1,14 +1,15 @@
-TESTS = check_main
-check_PROGRAMS = check_main
-check_main_SOURCES = 	check_main.c\
-						check_stack.c
+INCLUDE = @CHECK_CFLAGS@ -I$(top_builddir)/src -I$(top_builddir)/include
+LIBS = $(top_builddir)/lib/libopen62541.a @CHECK_LIBS@
 
-check_main_CFLAGS = @CHECK_CFLAGS@ -I$(top_builddir)/src -I$(top_builddir)/include
-check_main_LDADD = $(top_builddir)/lib/libopen62541.a @CHECK_LIBS@
+#add new tests to this line
+TESTS = check_stack check_list
+
+check_PROGRAMS = $(TESTS)
+AM_LDADD = $(LIBS)
 
 #optimization levels depending on debug
 if DEBUG
-        AM_CFLAGS = -O0
+        AM_CFLAGS = -O0 $(INCLUDE)
 else
-        AM_CFLAGS = -O2
+        AM_CFLAGS = -O2 $(INCLUDE)
 endif

+ 0 - 170
tests/check_main.c

@@ -1,170 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include "check.h"
-
-int main (void)
-{
-	int number_failed = 0;
-
-	Suite *s = testSuite_getPacketType();
-	SRunner *sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed = srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_decodeInt16();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_encodeInt16();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_decodeUInt16();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_encodeUInt16();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_decodeUInt32();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_encodeUInt32();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_decodeInt32();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_encodeInt32();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_decodeUInt64();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_encodeUInt64();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_decodeInt64();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_encodeInt64();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-
-	s = testSuite_encodeFloat();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_encodeDouble();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-
-	s = testSuite_encodeByte();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_encodeUAString();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_decodeUAString();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_diagnosticInfo_calcSize();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_extensionObject_calcSize();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_responseHeader_calcSize();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_encodeDataValue();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_encode_builtInDatatypeArray();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_expandedNodeId_calcSize();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	s = testSuite_dataValue_calcSize();
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-
-	/* <TESTSUITE_TEMPLATE>
-	s =  <TESTSUITENAME>;
-	sr = srunner_create(s);
-	srunner_run_all(sr,CK_NORMAL);
-	number_failed += srunner_ntests_failed(sr);
-	srunner_free(sr);
-	*/
-	return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
-
-}

+ 166 - 0
tests/check_stack.c

@@ -10,6 +10,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include "UA_config.h"
 #include "opcua_transportLayer.h"
 #include "opcua_binaryEncDec.h"
 #include "opcua_encodingLayer.h"
@@ -872,4 +873,169 @@ Suite* testSuite_dataValue_calcSize(void)
 	return s;
 }
 
+int main (void)
+{
+	int number_failed = 0;
+
+	Suite *s = testSuite_getPacketType();
+	SRunner *sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed = srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_decodeInt16();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_encodeInt16();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_decodeUInt16();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_encodeUInt16();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_decodeUInt32();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_encodeUInt32();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_decodeInt32();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_encodeInt32();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_decodeUInt64();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_encodeUInt64();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_decodeInt64();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_encodeInt64();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+
+	s = testSuite_encodeFloat();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_encodeDouble();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+
+	s = testSuite_encodeByte();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_encodeUAString();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_decodeUAString();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_diagnosticInfo_calcSize();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_extensionObject_calcSize();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_responseHeader_calcSize();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_encodeDataValue();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_encode_builtInDatatypeArray();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_expandedNodeId_calcSize();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	s = testSuite_dataValue_calcSize();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	/* <TESTSUITE_TEMPLATE>
+	s =  <TESTSUITENAME>;
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+	*/
+	return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
 
+}