checkpoint

Make the encoder tests run
Remove errors from the compiler.
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 02ff73c..339b83f 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -1,6 +1,6 @@
 name: CMake
 
-on: [push, pull_request]
+on: [pull_request]
 
 jobs:
   build:
@@ -32,10 +32,10 @@
       #     brew upgrade
       #     brew install cmake openssl
 
-      - name: setup (windows)
-        if: startsWith(matrix.os, 'windows')
-        run: |
-          choco install openssl cmake
+      # - name: setup (windows)
+      #   if: startsWith(matrix.os, 'windows')
+      #   run: |
+      #     choco install openssl cmake
 
       - name: Create Build directory
         run: cmake -E make_directory ${{runner.workspace}}/build
diff --git a/src/cn-cbor.c b/src/cn-cbor.c
index 7f547b3..b3f68ae 100644
--- a/src/cn-cbor.c
+++ b/src/cn-cbor.c
@@ -284,7 +284,7 @@
 				case AI_2:
 #ifndef CBOR_NO_FLOAT
 					cb->type = CN_CBOR_DOUBLE;
-					cb->v.dbl = decode_half(val);
+					cb->v.dbl = decode_half((int) val);
 #else  /*  CBOR_NO_FLOAT */
 					CN_CBOR_FAIL(CN_CBOR_ERR_FLOAT_NOT_SUPPORTED);
 #endif /*  CBOR_NO_FLOAT */
diff --git a/src/cn-encoder.c b/src/cn-encoder.c
index a6f14f9..8ce762c 100644
--- a/src/cn-encoder.c
+++ b/src/cn-encoder.c
@@ -101,6 +101,9 @@
 static bool _write_positive(cn_write_state *ws, cn_cbor_type typ, uint64_t val)
 {
 	assert((size_t)typ < sizeof(_xlate));
+	if (typ >= (int) sizeof(_xlate)) {
+		return false;
+	}
 
 	const uint8_t ib = _xlate[typ];
 	if (ib == 0xFF) {
diff --git a/src/cn-get.c b/src/cn-get.c
index 7a770f0..ced2243 100644
--- a/src/cn-get.c
+++ b/src/cn-get.c
@@ -11,6 +11,9 @@
 {
 	cn_cbor* cp;
 	assert(cb);
+	if (cb == NULL) {
+		return NULL;
+	}
 	for (cp = cb->first_child; cp && cp->next; cp = cp->next->next) {
 		switch (cp->type) {
 			case CN_CBOR_UINT:
@@ -35,6 +38,10 @@
 	cn_cbor* cp = NULL;
 	assert(cb != NULL);
 	assert(key != NULL);
+	if (cb == NULL || key == NULL) {
+		return NULL;
+	}
+	
 	size_t keylen = strlen(key);
 	for (cp = cb->first_child; cp && cp->next; cp = cp->next->next) {
 		switch (cp->type) {
@@ -58,6 +65,9 @@
 	cn_cbor* cp;
 	unsigned int i = 0;
 	assert(cb);
+	if (cb == NULL) {
+		return NULL;
+	}
 	for (cp = cb->first_child; cp; cp = cp->next) {
 		if (i == idx) {
 			return cp;
diff --git a/test/cbor_test.c b/test/cbor_test.c
index 029d507..27a4afd 100644
--- a/test/cbor_test.c
+++ b/test/cbor_test.c
@@ -43,8 +43,8 @@
 
 static bool parse_hex(char *inp, buffer *b)
 {
-	int len = strlen(inp);
-	size_t i;
+	size_t len = strlen(inp);
+	size_t i = 0;
 	if (len % 2 != 0) {
 		b->sz = -1;
 		b->ptr = NULL;
diff --git a/test/ctest.h b/test/ctest.h
index cc11925..16ed095 100644
--- a/test/ctest.h
+++ b/test/ctest.h
@@ -116,14 +116,14 @@
 #define ASSERT_STR(exp, real) assert_str(exp, real, __FILE__, __LINE__)
 
 void assert_data(const unsigned char* exp,
-	int expsize,
+	size_t expsize,
 	const unsigned char* real,
-	int realsize,
+	size_t realsize,
 	const char* caller,
 	int line);
 #define ASSERT_DATA(exp, expsize, real, realsize) assert_data(exp, expsize, real, realsize, __FILE__, __LINE__)
 
-void assert_equal(long exp, long real, const char* caller, int line);
+void assert_equal(size_t exp, size_t real, const char* caller, int line);
 #define ASSERT_EQUAL(exp, real) assert_equal(exp, real, __FILE__, __LINE__)
 
 void assert_not_equal(long exp, long real, const char* caller, int line);
@@ -259,9 +259,9 @@
 }
 
 void assert_data(const unsigned char* exp,
-	int expsize,
+	size_t expsize,
 	const unsigned char* real,
-	int realsize,
+	size_t realsize,
 	const char* caller,
 	int line)
 {
@@ -276,7 +276,7 @@
 	}
 }
 
-void assert_equal(long exp, long real, const char* caller, int line)
+void assert_equal(size_t exp, size_t real, const char* caller, int line)
 {
 	if (exp != real) {
 		CTEST_ERR("%s:%d  expected %ld, got %ld", caller, line, exp, real);
diff --git a/test/memory_test.c b/test/memory_test.c
index 19014d9..e370bd5 100644
--- a/test/memory_test.c
+++ b/test/memory_test.c
@@ -18,7 +18,10 @@
 #ifdef USE_CBOR_CONTEXT
 void CreateTests()
 {
-	cn_cbor_context* context = CreateContext(-1);
+	cn_cbor_context* context = NULL;
+
+	
+	context = CreateContext(-1);
 
 	//  Check the simple create/delete for memory leaks.
 
@@ -94,109 +97,268 @@
 	if (IsContextEmpty(context) > 0) {
 		CFails += 1;
 	}
+
+	
 }
 
 void DecoderTests() {}
 
 void EncoderTests()
 {
-	cn_cbor_context* context = CreateContext(-1);
+	bool finished = false;
+	for (int passNumber = 0; passNumber < 10000 && !finished; passNumber++) {
+		cn_cbor* cborRoot = NULL;
+		cn_cbor* cbor = NULL;
+		cn_cbor* cbor2 = NULL;
+		uint8_t* pb = NULL;
+		char* s = NULL;
 
-	cn_cbor* cborRoot = cn_cbor_array_create(context, NULL);
+		cn_cbor_context* context = CreateContext(passNumber);
+		if (context == NULL) {
+			CFails += 1;
+			return;
+		}
 
-	cn_cbor* cbor = cn_cbor_array_create(context, NULL);
-	cbor->flags |= CN_CBOR_FL_INDEF;
+		cborRoot = cn_cbor_array_create(context, NULL);
+		if (cborRoot == NULL) {
+			goto errorReturn;
+		}
 
-	cn_cbor* cbor2 = cn_cbor_simple_create(22, context, NULL);
-	cn_cbor_array_append(cbor, cbor2, NULL);
-	cbor2 = cn_cbor_simple_create(21, context, NULL);
-	cn_cbor_array_append(cbor, cbor2, NULL);
-	cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = cn_cbor_array_create(context, NULL);
+		if (cbor == NULL) {
+			goto errorReturn;
+		}
+		cbor->flags |= CN_CBOR_FL_INDEF;
 
-	cbor = cn_cbor_bool_create(true, context, NULL);
-	cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor2 = cn_cbor_simple_create(22, context, NULL);
+		if (cbor2 == NULL) {
+			goto errorReturn;
+		}
+		cn_cbor_array_append(cbor, cbor2, NULL);
+		cbor2 = NULL;
 
-	cbor = cn_cbor_map_create(context, NULL);
-	cbor2 = cn_cbor_string_create("Text1", context, NULL);
-	cn_cbor_mapput_int(cbor, 5, cbor2, context, NULL);
-	cbor2 = cn_cbor_int_create(99, context, NULL);
-	cn_cbor_mapput_string(cbor, "key", cbor2, context, NULL);
-	cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor2 = cn_cbor_simple_create(21, context, NULL);
+		if (cbor2 == NULL) {
+			goto errorReturn;
+		}
+		cn_cbor_array_append(cbor, cbor2, NULL);
+		cbor2 = NULL;
 
-	cbor = cn_cbor_map_create(context, NULL);
-	cbor->flags |= CN_CBOR_FL_INDEF;
-	cbor2 = cn_cbor_string_create("Text1", context, NULL);
-	cn_cbor_mapput_int(cbor, 5, cbor2, context, NULL);
-	cbor2 = cn_cbor_int_create(99, context, NULL);
-	cn_cbor_mapput_string(cbor, "key", cbor2, context, NULL);
-	cn_cbor_array_append(cborRoot, cbor, NULL);
+		cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = NULL;
 
-	cbor = cn_cbor_chunked_create(CN_CBOR_BYTES, context, NULL);
-	uint8_t* pb = context->calloc_func(10, 10, context);
-	cbor2 = cn_cbor_data_create2(pb, 100, 0, context, NULL);
-	cn_cbor_chunked_append(cbor, cbor2, NULL);
-	uint8_t data2[20] = {1, 2, 3, 4, 5, 6, 7};
-	cbor2 = cn_cbor_data_create(data2, 20, context, NULL);
-	cn_cbor_chunked_append(cbor, cbor2, NULL);
-	cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = cn_cbor_bool_create(true, context, NULL);
+		if (cbor == NULL) {
+			goto errorReturn;
+		}
+		cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = NULL;
 
-	cbor = cn_cbor_chunked_create(CN_CBOR_TEXT, context, NULL);
-	cbor2 = cn_cbor_string_create("This is a string", context, NULL);
-	cn_cbor_chunked_append(cbor, cbor2, NULL);
-	char* s = context->calloc_func(20, 1, context);
-	strcpy(s, "Hi Mom");
-	cbor2 = cn_cbor_string_create2(s, 0, context, NULL);
-	cn_cbor_chunked_append(cbor, cbor2, NULL);
-	cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = cn_cbor_map_create(context, NULL);
+		if (cbor == NULL) {
+			goto errorReturn;
+		}
 
-	cbor = cn_cbor_simple_create(4, context, NULL);
-	cbor = cn_cbor_tag_create(99, cbor, context, NULL);
-	cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor2 = cn_cbor_string_create("Text1", context, NULL);
+		if (cbor2 == NULL) {
+			goto errorReturn;
+		}
+		if (!cn_cbor_mapput_int(cbor, 5, cbor2, context, NULL)) {
+			goto errorReturn;
+		};
+		cbor2 = NULL;
+
+		cbor2 = cn_cbor_int_create(99, context, NULL);
+		if (cbor2 == NULL) {
+			goto errorReturn;
+		}
+		if (!cn_cbor_mapput_string(cbor, "key", cbor2, context, NULL)) {
+			goto errorReturn;
+		}
+		cbor2 = NULL;
+
+		cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = NULL;
+
+		cbor = cn_cbor_map_create(context, NULL);
+		if (cbor == NULL) {
+			goto errorReturn;
+		}
+		cbor->flags |= CN_CBOR_FL_INDEF;
+
+		cbor2 = cn_cbor_string_create("Text1", context, NULL);
+		if (cbor2 == NULL) {
+			goto errorReturn;
+		}
+		if (!cn_cbor_mapput_int(cbor, 5, cbor2, context, NULL)) {
+			goto errorReturn;
+		}
+		cbor2 = NULL;
+
+		cbor2 = cn_cbor_int_create(99, context, NULL);
+		if (cbor2 == NULL) {
+			goto errorReturn;
+		}
+		
+		if (!cn_cbor_mapput_string(cbor, "key", cbor2, context, NULL)) {
+			goto errorReturn;
+		}
+		cbor2 = NULL;
+
+		cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = NULL;
+
+		cbor = cn_cbor_chunked_create(CN_CBOR_BYTES, context, NULL);
+		if (cbor == NULL) {
+			goto errorReturn;
+		}
+		pb = context->calloc_func(10, 10, context);
+		cbor2 = cn_cbor_data_create2(pb, 100, 0, context, NULL);
+		if (cbor2 == NULL) {
+			goto errorReturn;
+		}
+		pb = NULL;
+
+		cn_cbor_chunked_append(cbor, cbor2, NULL);
+		cbor2 = NULL;
+
+		uint8_t data2[20] = {1, 2, 3, 4, 5, 6, 7};
+		cbor2 = cn_cbor_data_create(data2, 20, context, NULL);
+		if (cbor2 == NULL) {
+			goto errorReturn;
+		}
+		cn_cbor_chunked_append(cbor, cbor2, NULL);
+		cbor2 = NULL;
+
+		cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = NULL;
+
+		cbor = cn_cbor_chunked_create(CN_CBOR_TEXT, context, NULL);
+		if (cbor == NULL) {
+			goto errorReturn;
+		}
+
+		cbor2 = cn_cbor_string_create("This is a string", context, NULL);
+		if (cbor2 == NULL) {
+			goto errorReturn;
+		}
+		cn_cbor_chunked_append(cbor, cbor2, NULL);
+		cbor2 = NULL;
+
+		s = context->calloc_func(20, 1, context);
+		if (s == NULL) {
+			goto errorReturn;
+		}
+		strcpy(s, "Hi Mom");
+		cbor2 = cn_cbor_string_create2(s, 0, context, NULL);
+		if (cbor2 == NULL) {
+			goto errorReturn;
+		}
+		s = NULL;
+
+		cn_cbor_chunked_append(cbor, cbor2, NULL);
+		cbor2 = NULL;
+
+		cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = NULL;
+
+		cbor = cn_cbor_simple_create(4, context, NULL);
+		if (cbor == NULL) {
+			goto errorReturn;
+		}
+		cbor2 = cn_cbor_tag_create(99, cbor, context, NULL);
+		if (cbor2 == NULL) {
+			goto errorReturn;
+		}
+		cbor = NULL;
+		cn_cbor_array_append(cborRoot, cbor2, NULL);
+		cbor2 = NULL;
 
 #ifndef CBOR_NO_FLOATS
-	cbor = cn_cbor_float_create(9, context, NULL);
-	cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = cn_cbor_float_create(9, context, NULL);
+		if (cbor == NULL) {
+			goto errorReturn;
+		}
+		cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = NULL;
 
-	cbor = cn_cbor_double_create(33.225932523223, context, NULL);
-	cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = cn_cbor_double_create(33.225932523223, context, NULL);
+		if (cbor == NULL) {
+			goto errorReturn;
+		}
+		cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = NULL;
 
-	cbor = cn_cbor_float_create(9, context, NULL);
-	cbor->flags |= CN_CBOR_FL_KEEP_FLOAT_SIZE;
-	cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = cn_cbor_float_create(9, context, NULL);
+		if (cbor == NULL) {
+			goto errorReturn;
+		}
+		cbor->flags |= CN_CBOR_FL_KEEP_FLOAT_SIZE;
+		cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = NULL;
 
-	cbor = cn_cbor_double_create(9, context, NULL);
-	cbor->flags |= CN_CBOR_FL_KEEP_FLOAT_SIZE;
-	cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = cn_cbor_double_create(9, context, NULL);
+		if (cbor == NULL) {
+			goto errorReturn;
+		}
+		cbor->flags |= CN_CBOR_FL_KEEP_FLOAT_SIZE;
+		cn_cbor_array_append(cborRoot, cbor, NULL);
+		cbor = NULL;
 #endif
 
-	ssize_t cb = cn_cbor_encoder_write(NULL, 0, 0, cborRoot);
-	pb = (uint8_t*)context->calloc_func(cb + 2, 1, context);
+		ssize_t cb = cn_cbor_encoder_write(NULL, 0, 0, cborRoot);
+		pb = (uint8_t*)context->calloc_func(cb + 2, 1, context);
+		if (pb == NULL) {
+			goto errorReturn;
+		}
 
-	ssize_t cb2 = cn_cbor_encoder_write(pb, 0, cb - 1, cborRoot);
-	if (cb2 != -1) {
-		CFails += 1;
-	}
+		ssize_t cb2 = cn_cbor_encoder_write(pb, 0, cb - 1, cborRoot);
+		if (cb2 != -1) {
+			CFails += 1;
+		}
 
-	cb2 = cn_cbor_encoder_write(pb, 0, cb, cborRoot);
-	if (cb2 != cb) {
-		CFails += 1;
-	}
+		cb2 = cn_cbor_encoder_write(pb, 0, cb, cborRoot);
+		if (cb2 != cb) {
+			CFails += 1;
+		}
 
-	cb2 = cn_cbor_encoder_write(pb, 0, cb + 1, cborRoot);
-	if (cb != cb2) {
-		CFails += 1;
-	}
+		cb2 = cn_cbor_encoder_write(pb, 0, cb + 1, cborRoot);
+		if (cb != cb2) {
+			CFails += 1;
+		}
 
-	cn_cbor_free(cborRoot, context);
+		cn_cbor_free(cborRoot, context);
+		cborRoot = NULL;
 
-	cborRoot = cn_cbor_decode(pb, cb2, context, NULL);
+		cborRoot = cn_cbor_decode(pb, cb2, context, NULL);
+		if (cborRoot == NULL) {
+			goto errorReturn;
+		}
 
-	cn_cbor_free(cborRoot, context);
+		finished = true;
 
-	context->free_func(pb, context);
+	errorReturn:
+		if (cborRoot != NULL) {
+			cn_cbor_free(cborRoot, context);
+		}
+		if (cbor != NULL) {
+			cn_cbor_free(cbor, context);
+		}
+		if (cbor2 != NULL) {
+			cn_cbor_free(cbor2, context);
+		}
+		if (pb != NULL) {
+			context->free_func(pb, context);
+		}
+		if (s != NULL) {
+			context->free_func(s, context);
+		}
 
-	if (IsContextEmpty(context) > 0) {
-		CFails += 1;
+		if (IsContextEmpty(context) > 0) {
+			CFails += 1;
+		}
+
+    FreeContext(context);
 	}
 }
 #endif