--- a
+++ b/src/foreign/levmar/misc.h
@@ -0,0 +1,85 @@
+/////////////////////////////////////////////////////////////////////////////////
+// 
+//  Levenberg - Marquardt non-linear minimization algorithm
+//  Copyright (C) 2004  Manolis Lourakis (lourakis@ics.forth.gr)
+//  Institute of Computer Science, Foundation for Research & Technology - Hellas
+//  Heraklion, Crete, Greece.
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+/////////////////////////////////////////////////////////////////////////////////
+
+#ifndef _MISC_H_
+#define _MISC_H_
+
+/* common prefix for BLAS subroutines */
+#define LM_BLAS_PREFIX // none
+//#define LM_BLAS_PREFIX f2c_   // f2c'd BLAS
+//#define LM_BLAS_PREFIX cblas_ // C interface to BLAS
+
+#define LCAT_(a, b)    #a b
+#define LCAT(a, b)    LCAT_(a, b) // force substitution
+#define RCAT_(a, b)    a #b
+#define RCAT(a, b)    RCAT_(a, b) // force substitution
+
+#define __BLOCKSZ__       32 /* block size for cache-friendly matrix-matrix multiply. It should be
+                              * such that __BLOCKSZ__^2*sizeof(LM_REAL) is smaller than the CPU (L1)
+                              * data cache size. Notice that a value of 32 when LM_REAL=double assumes
+                              * an 8Kb L1 data cache (32*32*8=8K). This is a concervative choice since
+                              * newer Pentium 4s have a L1 data cache of size 16K, capable of holding
+                              * up to 45x45 double blocks.
+                              */
+#define __BLOCKSZ__SQ    (__BLOCKSZ__)*(__BLOCKSZ__)
+
+#ifdef _MSC_VER
+#define inline __inline //MSVC
+#elif !defined(__GNUC__)
+#define inline //other than MSVC, GCC: define empty
+#endif
+
+/* add a prefix in front of a token */
+#define LM_CAT__(a, b) a ## b
+#define LM_CAT_(a, b) LM_CAT__(a, b) // force substitution
+#define LM_ADD_PREFIX(s) LM_CAT_(LM_PREFIX, s)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* blocking-based matrix multiply */
+extern void strans_mat_mat_mult(float *a, float *b, int n, int m);
+extern void dtrans_mat_mat_mult(double *a, double *b, int n, int m);
+
+/* forward finite differences */
+extern void sfdif_forw_jac_approx(void (*func)(float *p, float *hx, int m, int n, void *adata),
+					float *p, float *hx, float *hxx, float delta,
+					float *jac, int m, int n, void *adata);
+extern void dfdif_forw_jac_approx(void (*func)(double *p, double *hx, int m, int n, void *adata),
+					double *p, double *hx, double *hxx, double delta,
+					double *jac, int m, int n, void *adata);
+
+/* central finite differences */
+extern void sfdif_cent_jac_approx(void (*func)(float *p, float *hx, int m, int n, void *adata),
+          float *p, float *hxm, float *hxp, float delta,
+          float *jac, int m, int n, void *adata);
+extern void dfdif_cent_jac_approx(void (*func)(double *p, double *hx, int m, int n, void *adata),
+          double *p, double *hxm, double *hxp, double delta,
+          double *jac, int m, int n, void *adata);
+
+/* covariance of LS fit */
+extern int slevmar_covar(float *JtJ, float *C, float sumsq, int m, int n);
+extern int dlevmar_covar(double *JtJ, double *C, double sumsq, int m, int n);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _MISC_H */