Portability fix: replacing tables of variable size with memory allocations
diff --git a/lib/decoding/openbts/AmrCoder.cpp b/lib/decoding/openbts/AmrCoder.cpp
index 718baf0..db5b2d8 100644
--- a/lib/decoding/openbts/AmrCoder.cpp
+++ b/lib/decoding/openbts/AmrCoder.cpp
@@ -24,11 +24,10 @@
 #include <iostream>
 #include <stdio.h>
 #include <sstream>
+#include <cstdlib>
 
 using namespace std;
 
-
-
 ViterbiTCH_AFS12_2::ViterbiTCH_AFS12_2()
 {
 	assert(mDeferral < 32);
@@ -378,7 +377,7 @@
 	assert(sz == decoder.iRate()*target.size());
 
 	// Build a "history" array where each element contains the full history.
-	uint32_t history[ctsz];
+	uint32_t * history = (uint32_t *)malloc(sizeof(uint32_t)*ctsz);
 	{
 		BitVector bits = in.sliced();
 		uint32_t accum = 0;
@@ -394,8 +393,8 @@
 	}
 
 	// Precompute metric tables.
-	float matchCostTable[ctsz];
-	float mismatchCostTable[ctsz];
+	float * matchCostTable = (float *)malloc(sizeof(float)*ctsz);
+	float * mismatchCostTable = (float *)malloc(sizeof(float)*ctsz);
 	{
 		const float *dp = in.begin();
 		for (size_t i=0; i<sz; i++) {
@@ -445,6 +444,9 @@
 			oCount++;
 		}
 	}
+	free(history);
+	free(matchCostTable);
+	free(mismatchCostTable);
 }
 
 
@@ -582,7 +584,7 @@
 	assert(sz == decoder.iRate()*target.size());
 
 	// Build a "history" array where each element contains the full history.
-	uint32_t history[ctsz];
+	uint32_t * history = (uint32_t *)malloc(sizeof(uint32_t)*ctsz);
 	{
 		BitVector bits = in.sliced();
 		uint32_t accum = 0;
@@ -598,8 +600,8 @@
 	}
 
 	// Precompute metric tables.
-	float matchCostTable[ctsz];
-	float mismatchCostTable[ctsz];
+	float * matchCostTable = (float *)malloc(sizeof(float)*ctsz);
+	float * mismatchCostTable = (float *)malloc(sizeof(float)*ctsz);
 	{
 		const float *dp = in.begin();
 		for (size_t i=0; i<sz; i++) {
@@ -649,6 +651,9 @@
 			oCount++;
 		}
 	}
+	free(history);
+	free(matchCostTable);
+	free(mismatchCostTable);
 }
 
 
@@ -786,7 +791,7 @@
 	assert(sz == decoder.iRate()*target.size());
 
 	// Build a "history" array where each element contains the full history.
-	uint32_t history[ctsz];
+	uint32_t * history = (uint32_t *)malloc(sizeof(uint32_t)*ctsz);
 	{
 		BitVector bits = in.sliced();
 		uint32_t accum = 0;
@@ -802,8 +807,8 @@
 	}
 
 	// Precompute metric tables.
-	float matchCostTable[ctsz];
-	float mismatchCostTable[ctsz];
+	float * matchCostTable = (float *)malloc(sizeof(float)*ctsz);
+	float * mismatchCostTable = (float *)malloc(sizeof(float)*ctsz);
 	{
 		const float *dp = in.begin();
 		for (size_t i=0; i<sz; i++) {
@@ -853,6 +858,9 @@
 			oCount++;
 		}
 	}
+	free(history);
+	free(matchCostTable);
+	free(mismatchCostTable);
 }
 
 
@@ -990,7 +998,7 @@
 	assert(sz == decoder.iRate()*target.size());
 
 	// Build a "history" array where each element contains the full history.
-	uint32_t history[ctsz];
+	uint32_t * history = (uint32_t *)malloc(sizeof(uint32_t)*ctsz);
 	{
 		BitVector bits = in.sliced();
 		uint32_t accum = 0;
@@ -1006,8 +1014,8 @@
 	}
 
 	// Precompute metric tables.
-	float matchCostTable[ctsz];
-	float mismatchCostTable[ctsz];
+	float * matchCostTable = (float *)malloc(sizeof(float)*ctsz);
+	float * mismatchCostTable = (float *)malloc(sizeof(float)*ctsz);
 	{
 		const float *dp = in.begin();
 		for (size_t i=0; i<sz; i++) {
@@ -1057,6 +1065,9 @@
 			oCount++;
 		}
 	}
+	free(history);
+	free(matchCostTable);
+	free(mismatchCostTable);
 }
 
 
@@ -1196,7 +1207,7 @@
 	assert(sz == decoder.iRate()*target.size());
 
 	// Build a "history" array where each element contains the full history.
-	uint32_t history[ctsz];
+	uint32_t * history = (uint32_t *)malloc(sizeof(uint32_t)*ctsz);
 	{
 		BitVector bits = in.sliced();
 		uint32_t accum = 0;
@@ -1212,8 +1223,8 @@
 	}
 
 	// Precompute metric tables.
-	float matchCostTable[ctsz];
-	float mismatchCostTable[ctsz];
+	float * matchCostTable = (float *)malloc(sizeof(float)*ctsz);
+	float * mismatchCostTable = (float *)malloc(sizeof(float)*ctsz);
 	{
 		const float *dp = in.begin();
 		for (size_t i=0; i<sz; i++) {
@@ -1263,6 +1274,9 @@
 			oCount++;
 		}
 	}
+	free(history);
+	free(matchCostTable);
+	free(mismatchCostTable);
 }
 
 
@@ -1402,7 +1416,7 @@
 	assert(sz == decoder.iRate()*target.size());
 
 	// Build a "history" array where each element contains the full history.
-	uint32_t history[ctsz];
+	uint32_t * history = (uint32_t *)malloc(sizeof(uint32_t)*ctsz);
 	{
 		BitVector bits = in.sliced();
 		uint32_t accum = 0;
@@ -1418,8 +1432,8 @@
 	}
 
 	// Precompute metric tables.
-	float matchCostTable[ctsz];
-	float mismatchCostTable[ctsz];
+	float * matchCostTable = (float *)malloc(sizeof(float)*ctsz);
+	float * mismatchCostTable = (float *)malloc(sizeof(float)*ctsz);
 	{
 		const float *dp = in.begin();
 		for (size_t i=0; i<sz; i++) {
@@ -1469,6 +1483,9 @@
 			oCount++;
 		}
 	}
+	free(history);
+	free(matchCostTable);
+	free(mismatchCostTable);
 }
 
 
@@ -1610,7 +1627,7 @@
 	assert(sz == decoder.iRate()*target.size());
 
 	// Build a "history" array where each element contains the full history.
-	uint32_t history[ctsz];
+	uint32_t * history = (uint32_t *)malloc(sizeof(uint32_t)*ctsz);
 	{
 		BitVector bits = in.sliced();
 		uint32_t accum = 0;
@@ -1626,8 +1643,8 @@
 	}
 
 	// Precompute metric tables.
-	float matchCostTable[ctsz];
-	float mismatchCostTable[ctsz];
+	float * matchCostTable = (float *)malloc(sizeof(float)*ctsz);
+	float * mismatchCostTable = (float *)malloc(sizeof(float)*ctsz);
 	{
 		const float *dp = in.begin();
 		for (size_t i=0; i<sz; i++) {
@@ -1677,6 +1694,9 @@
 			oCount++;
 		}
 	}
+	free(history);
+	free(matchCostTable);
+	free(mismatchCostTable);
 }
 
 
@@ -1818,7 +1838,7 @@
 	assert(sz == decoder.iRate()*target.size());
 
 	// Build a "history" array where each element contains the full history.
-	uint32_t history[ctsz];
+	uint32_t * history = (uint32_t *)malloc(sizeof(uint32_t)*ctsz);
 	{
 		BitVector bits = in.sliced();
 		uint32_t accum = 0;
@@ -1834,8 +1854,8 @@
 	}
 
 	// Precompute metric tables.
-	float matchCostTable[ctsz];
-	float mismatchCostTable[ctsz];
+	float * matchCostTable = (float *)malloc(sizeof(float)*ctsz);
+	float * mismatchCostTable = (float *)malloc(sizeof(float)*ctsz);
 	{
 		const float *dp = in.begin();
 		for (size_t i=0; i<sz; i++) {
@@ -1885,6 +1905,9 @@
 			oCount++;
 		}
 	}
+	free(history);
+	free(matchCostTable);
+	free(mismatchCostTable);
 }
 
 
diff --git a/lib/decoding/openbts/ViterbiR204.cpp b/lib/decoding/openbts/ViterbiR204.cpp
index 296e292..fe31aad 100644
--- a/lib/decoding/openbts/ViterbiR204.cpp
+++ b/lib/decoding/openbts/ViterbiR204.cpp
@@ -28,6 +28,7 @@
 #include <stdio.h>
 #include <sstream>
 #include <string.h>
+#include <cstdlib>
 
 using namespace std;
 
@@ -70,7 +71,7 @@
 	assert(sz*coder.iRate() == target.size());
 
 	// Build a "history" array where each element contains the full history.
-	uint32_t history[sz];
+	uint32_t * history = (uint32_t *) malloc(sizeof(uint32_t)*sz);
 	uint32_t accum = 0;
 	for (size_t i=0; i<sz; i++) {
 		accum = (accum<<1) | in.bit(i);
@@ -85,6 +86,7 @@
 			*op++ = coder.stateTable(g,index);
 		}
 	}
+	free(history);
 }
 
 
@@ -224,7 +226,7 @@
 
 	// Build a "history" array where each element contains the full history.
 	// (pat) We only use every other history element, so why are we setting them?
-	uint32_t history[ctsz];
+	uint32_t * history = (uint32_t *)malloc(sizeof(uint32_t)*ctsz);
 	{
 		BitVector bits = in.sliced();
 		uint32_t accum = 0;
@@ -241,8 +243,8 @@
 	}
 
 	// Precompute metric tables.
-	float matchCostTable[ctsz];
-	float mismatchCostTable[ctsz];
+	float * matchCostTable = (float *)malloc(sizeof(float)*ctsz);
+	float * mismatchCostTable = (float *)malloc(sizeof(float)*ctsz);
 	{
 		const float *dp = in.begin();
 		for (size_t i=0; i<sz; i++) {
@@ -296,6 +298,9 @@
 		// Dont think minCost == NULL can happen.
 		mBitErrorCnt = minCost ? minCost->bitErrorCnt : 0;
 	}
+	free(history);
+	free(matchCostTable);
+	free(mismatchCostTable);
 }
 
 // vim: ts=4 sw=4