removed goto statements for the most part
diff --git a/contrib/adaptive-compression/adapt.c b/contrib/adaptive-compression/adapt.c
index c216071..addd0c5 100644
--- a/contrib/adaptive-compression/adapt.c
+++ b/contrib/adaptive-compression/adapt.c
@@ -92,6 +92,11 @@
     ZSTD_CCtx* cctx;
 } adaptCCtx;
 
+typedef struct {
+    FILE* srcFile;
+    adaptCCtx* ctx;
+} fcResources;
+
 static void freeCompressionJobs(adaptCCtx* ctx)
 {
     unsigned u;
@@ -207,6 +212,7 @@
 
 static void waitUntilAllJobsCompleted(adaptCCtx* ctx)
 {
+    if (!ctx) return;
     pthread_mutex_lock(&ctx->allJobsCompleted_mutex);
     while (ctx->allJobsCompleted == 0) {
         pthread_cond_wait(&ctx->allJobsCompleted_cond, &ctx->allJobsCompleted_mutex);
@@ -466,40 +472,10 @@
     DISPLAY("# times waited on job Write: %u\n\n", stats.waitWrite);
 }
 
-static int compressFilename(const char* const srcFilename, const char* const dstFilenameOrNull)
+static int performCompression(adaptCCtx* ctx, FILE* const srcFile)
 {
-    unsigned const stdinUsed = !strcmp(srcFilename, stdinmark);
-    FILE* const srcFile = stdinUsed ? stdin : fopen(srcFilename, "rb");
-    const char* const outFilenameIntermediate = (stdinUsed && !dstFilenameOrNull) ? stdoutmark : dstFilenameOrNull;
-    const char* outFilename = outFilenameIntermediate;
-    char fileAndSuffix[MAX_PATH];
-    size_t const numJobs = MAX_NUM_JOBS;
-    int ret = 0;
-    adaptCCtx* ctx = NULL;
-    UTIL_getTime(&g_startTime);
-    g_streamedSize = 0;
-
-    if (!outFilenameIntermediate) {
-        if (snprintf(fileAndSuffix, MAX_PATH, "%s.zst", srcFilename) + 1 > MAX_PATH) {
-            DISPLAY("Error: output filename is too long\n");
-            ret = 1;
-            goto cleanup;
-        }
-        outFilename = fileAndSuffix;
-    }
-
-    /* checking for errors */
-    if (!srcFilename || !outFilename || !srcFile) {
-        DISPLAY("Error: initial variables could not be allocated\n");
-        ret = 1;
-        goto cleanup;
-    }
-
-    /* creating context */
-    ctx = createCCtx(numJobs, outFilename);
-    if (ctx == NULL) {
-        ret = 1;
-        goto cleanup;
+    if (!ctx || !srcFile) {
+        return 1;
     }
 
     /* create output thread */
@@ -507,8 +483,8 @@
         pthread_t out;
         if (pthread_create(&out, NULL, &outputThread, ctx)) {
             DISPLAY("Error: could not create output thread\n");
-            ret = 1;
-            goto cleanup;
+            ctx->threadError = 1;
+            return 1;
         }
     }
 
@@ -517,8 +493,8 @@
         pthread_t compression;
         if (pthread_create(&compression, NULL, &compressionThread, ctx)) {
             DISPLAY("Error: could not create compression thread\n");
-            ret = 1;
-            goto cleanup;
+            ctx->threadError = 1;
+            return 1;
         }
     }
 
@@ -528,8 +504,7 @@
         if (readSize != FILE_CHUNK_SIZE && !feof(srcFile)) {
             DISPLAY("Error: problem occurred during read from src file\n");
             ctx->threadError = 1;
-            ret = 1;
-            goto cleanup;
+            return 1;
         }
         g_streamedSize += readSize;
         /* reading was fine, now create the compression job */
@@ -537,9 +512,8 @@
             int const last = feof(srcFile);
             int const error = createCompressionJob(ctx, readSize, last);
             if (error != 0) {
-                ret = error;
                 ctx->threadError = 1;
-                goto cleanup;
+                return error;
             }
         }
         if (feof(srcFile)) {
@@ -548,12 +522,60 @@
         }
     }
 
-cleanup:
-    waitUntilAllJobsCompleted(ctx);
-    if (g_displayStats) printStats(ctx->stats);
-    /* file compression completed */
-    ret  |= (srcFile != NULL) ? fclose(srcFile) : 0;
-    ret |= (ctx != NULL) ? freeCCtx(ctx) : 0;
+    /* success -- created all jobs */
+    return 0;
+}
+
+static fcResources createFileCompressionResources(const char* const srcFilename, const char* const dstFilenameOrNull)
+{
+    fcResources fcr;
+    unsigned const stdinUsed = !strcmp(srcFilename, stdinmark);
+    FILE* const srcFile = stdinUsed ? stdin : fopen(srcFilename, "rb");
+    const char* const outFilenameIntermediate = (stdinUsed && !dstFilenameOrNull) ? stdoutmark : dstFilenameOrNull;
+    const char* outFilename = outFilenameIntermediate;
+    char fileAndSuffix[MAX_PATH];
+    size_t const numJobs = MAX_NUM_JOBS;
+
+    memset(&fcr, 0, sizeof(fcr));
+
+    if (!outFilenameIntermediate) {
+        if (snprintf(fileAndSuffix, MAX_PATH, "%s.zst", srcFilename) + 1 > MAX_PATH) {
+            DISPLAY("Error: output filename is too long\n");
+            return fcr;
+        }
+        outFilename = fileAndSuffix;
+    }
+
+    /* checking for errors */
+    if (!outFilename || !srcFile) {
+        DISPLAY("Error: initial variables could not be allocated\n");
+        return fcr;
+    }
+
+    /* creating context */
+    fcr.ctx = createCCtx(numJobs, outFilename);
+    fcr.srcFile = srcFile;
+    return fcr;
+}
+
+static int freeFileCompressionResources(fcResources* fcr)
+{
+    int ret = 0;
+    waitUntilAllJobsCompleted(fcr->ctx);
+    if (g_displayStats) printStats(fcr->ctx->stats);
+    ret |= (fcr->srcFile != NULL) ? fclose(fcr->srcFile) : 0;
+    ret |= (fcr->ctx != NULL) ? freeCCtx(fcr->ctx) : 0;
+    return ret;
+}
+
+static int compressFilename(const char* const srcFilename, const char* const dstFilenameOrNull)
+{
+    int ret = 0;
+    UTIL_getTime(&g_startTime);
+    g_streamedSize = 0;
+    fcResources fcr = createFileCompressionResources(srcFilename, dstFilenameOrNull);
+    ret |= performCompression(fcr.ctx, fcr.srcFile);
+    ret |= freeFileCompressionResources(&fcr);
     return ret;
 }