#include "./pblas.h"

#ifdef __STDC__
typedef void (*CPYPTR)(int, int, float *, int, float *, int);
#define SLVOID void
#else
typedef void (*CPYPTR)();
#define SLVOID char
#endif

#define ErrPrnt fprintf(stderr, "line %d of file %s\n",__LINE__, __FILE__);

#define Mdescset(desc, m, n, mb, nb, rsrc, csrc, ictxt, lld) \
{ \
   (desc)[DT_] = BLOCK_CYCLIC_2D; \
   (desc)[CTXT_] = (ictxt); \
   (desc)[M_] = (m); \
   (desc)[N_] = (n); \
   (desc)[MB_] = (mb); \
   (desc)[NB_] = (nb); \
   (desc)[RSRC_] = (rsrc); \
   (desc)[CSRC_] = (csrc); \
   (desc)[LLD_] = (lld); \
}

#define MCindxg2p(IG, nb, srcproc, nprocs) \
        ( ((srcproc) + (IG)/(nb)) % nprocs )

typedef struct {double r, i;} DCOMPLEX;
typedef struct {float r, i;} SCOMPLEX;

#define Mmalloc(M_ptr, M_type, M_elt, M_i, M_ctxt) \
{ \
   void pberror_(); \
   (M_ptr) = ( M_type * ) malloc((M_elt)*(sizeof(M_type))); \
   if (!(M_ptr)) \
   { \
      if ((M_elt) > 0) \
      { \
         (M_i) = 1; \
         fprintf(stderr, "Not enough memory on line %d of file %s!!\n", \
                 __LINE__, __FILE__); \
         pberror_(&(M_ctxt), __FILE__, &(M_i)); \
      } \
   } \
}