/*
 * CBIND.C -- C binding for the IMFORT interface, for BSD UNIX and derived
 * systems.  As far as possible, the C function calls resemble those of the
 * Fortran oriented IMFORT interface, e.g., the function status is returned
 * as an argument rather than as the function value.
 */

#define	SZ_OPNAME	80
#define SZ_KEYWORD	20

int clargc (int	argno ,
             char *outstr	,
             int	*ier ) 
{ clargc_ (&argno, outstr, ier, SZ_OPNAME); sstrip (outstr,SZ_OPNAME); }

int clargi (int argno ,
             int *ival ,
             int *ier	) 
{ clargi_ (&argno, ival, ier); }

int clargr (int argno ,
             float *rval	,
             int *ier ) 
{ clargr_ (&argno, rval, ier); }

int clargd (int argno ,
             double *dval	,
             int *ier ) 
{ clargd_ (&argno, dval, ier); }

int clnarg (int *nargs	) 
{ clnarg_ (nargs); }

int clrawc (char *outstr ,
             int *ier	) 
{ clrawc_ (outstr, ier, SZ_OPNAME); sstrip (outstr, SZ_OPNAME); }

int imacck (int im ,
             char *key	,
             int *ier ) 
{ imacck_ (&im, key, ier, strlen(key)); }

int imaddk (int im ,
             char *keyw ,
             int dtype ,
             char *comm ,
             int *ier	) 
{ imaddk_ (&im, keyw, &dtype, comm, ier, strlen(keyw), strlen(comm)); }

int imakwb (int im ,
             char *keyw ,
             int bval ,
             char *comm 	,
             int *ier ) 
{ imakwb_ (&im, keyw, &bval, comm, ier, strlen(keyw), strlen(comm)); }

int imakwc (int im ,
             char *keyw ,
             char *sval ,
             char *comm	,
             int *ier ) 
{ imakwc_ (&im, keyw, sval, comm, ier, strlen(keyw), strlen(sval),
	    strlen(comm)); }

int imakwi (int im ,
             char *keyw ,
             int ival ,
             char *comm	,
             int *ier ) 
{ imakwi_ (&im, keyw, &ival, comm, ier, strlen(keyw), strlen(comm)); }

int imakwd (int im ,
             char *keyw ,
             double dval	,
             char *comm ,
             int *ier ) 
{ imakwd_ (&im, keyw, &dval, comm, ier, strlen(keyw), strlen(comm));  }
	
int imakwr (int im ,
             char *keyw ,
             float rval	,
             char *comm ,
             int *ier ) 
{ float f = rval;
	  imakwr_ (&im, keyw, &f, comm, ier, strlen(keyw), strlen(comm)); }

int imclos (int im ,
             int *ier	) 
{ imclos_ (&im, ier); }

int imcrea (char *f77nam ,
             int *axlen ,
             int naxis ,
             int pixtype ,
             int *ier	) 
{ imcrea_ (f77nam, axlen, &naxis, &pixtype, ier, strlen (f77nam)); }

int imcrex (char *image ,
             int *axlen ,
             int naxis ,
             int pixtype ,
             int *ier	) 
{ imcrex_ (image, axlen, &naxis, &pixtype, ier, strlen(image)); }

int imdele (char *image ,
             int *ier	) 
{ imdele_ (image, ier, strlen(image)); }

int imdelk (int im ,
             char *keyw	,
             int *ier ) 
{ imdelk_ (&im, keyw, ier, strlen(keyw)); }

int imemsg (int ier ,
             char *errmsg	) 
{ imemsg_ (&ier, errmsg, SZ_OPNAME); sstrip (errmsg, SZ_OPNAME); }

int imflsh (int im ,
             int *ier	) 
{ imflsh_ (&im, ier); }

int imgdir (char *dir	) 
{ imgdir_ (dir, strlen(dir)); sstrip (dir, SZ_OPNAME); }

int imgkwb (int im ,
             char *keyw 	,
             int *bval ,
             int *ier ) 
{ imgkwb_ (&im, keyw, bval, ier, strlen(keyw)); }

int imgkwc (int im ,
             char *keyw ,
             char *sval	,
             int *ier ) 
{ imgkwc_ (&im, keyw, sval, ier, strlen(keyw), SZ_OPNAME); 
	  sstrip (sval, SZ_OPNAME); }

int imgkwd (int im ,
             char *keyw ,
             double *dval	,
             int *ier ) 
{ imgkwd_ (&im, keyw, dval, ier, strlen(keyw)); }

int imgkwi (int im ,
             char *keyw	,
             int *ival ,
             int *ier ) 
{ imgkwi_ (&im, keyw, ival, ier, strlen(keyw)); }

int imgkwr (int im ,
             char *keyw ,
             float *rval	,
             int *ier ) 
{ imgkwr_ (&im, keyw, rval, ier, strlen (keyw)); }

int imgl1r (int im ,
             float *buf	,
             int *ier ) 
{ imgl1r_ (&im, buf, ier); }

int imgl1s (int im ,
             short *buf	,
             int *ier ) 
{ imgl1s_ (&im, buf, ier); }

int imgl2r (int im ,
             float *buf	,
             int lineno ,
             int *ier ) 
{ imgl2r_ (&im, buf, &lineno, ier); }

int imgl2s (int im ,
             short *buf	,
             int lineno ,
             int *ier ) 
{ imgl2s_ (&im, buf, &lineno, ier); }

int imgl3r (int im ,
             float *buf	,
             int lineno ,
             int bandno ,
             int *ier )	
{ imgl3r_ (&im, buf, &lineno, &bandno, ier); }

int imgl3s (int im ,
             short *buf	,
             int lineno ,
             int bandno ,
             int *ier )	
{ imgl3s_ (&im, buf, &lineno, &bandno, ier); }

int imgs1r (int im ,
             float *buf	,
             int i1 ,
             int i2 ,
             int *ier ) 
{ imgs1r_ (&im, buf, &i1, &i2, ier); }

int imgs1s (int im ,
             short *buf	,
             int i1 ,
             int i2 ,
             int *ier ) 
{ imgs1s_ (&im, buf, &i1, &i2, ier); }

int imgs2r (int im ,
             float *buf	,
             int i1 ,
             int i2 ,
             int j1 ,
             int j2 ,
             int *ier ) 
{ imgs2r_ (&im, buf, &i1, &i2, &j1, &j2, ier); }

int imgs2s (int im ,
             short *buf	,
             int i1 ,
             int i2 ,
             int j1 ,
             int j2 ,
             int *ier )	
{ imgs2s_ (&im, buf, &i1, &i2, &j1, &j2, ier); }

int imgs3r (int im ,
             float *buf	,
             int i1 ,
             int i2 ,
             int j1 ,
             int j2 ,
             int k1 ,
             int k2 ,
             int *ier )	
{ imgs3r_ (&im, buf, &i1, &i2, &j1, &j2, &k1, &k2, ier); }

int imgs3s (int im ,
             short *buf	,
             int i1 ,
             int i2 ,
             int j1 ,
             int j2 ,
             int k1 ,
             int k2 ,
             int *ier )	
{ imgs3s_ (&im, buf, &i1, &i2, &j1, &j2, &k1, &k2, ier); }

int imgsiz (int im ,
             int *axlen ,
             int *naxis ,
             int *pixtype ,
             int *ier	) 
{ imgsiz_ (&im, axlen, naxis, pixtype, ier); }

int imhcpy (int o_im ,
             int n_im ,
             int *ier	) 
{ imhcpy_ (&o_im, &n_im, ier); }

int imokwl (int im ,
             char *patstr ,
             int sortit	,
             int *kwl ,
             int *ier )	
{ imokwl_ (&im, patstr, &sortit, kwl, ier, strlen(patstr)); }

int imgnkw (int kwl ,
             char *outstr	,
             int *ier ) 
{ imgnkw_ (&kwl, outstr, ier, SZ_KEYWORD); sstrip (outstr,SZ_KEYWORD); }

int imckwl (int kwl ,
             int *ier	) 
{ imckwl_ (&kwl, ier); }

int imopen (char *f77nam ,
             int acmode ,
             int *im ,
             int *ier	) 
{ imopen_ (f77nam, &acmode, im, ier, strlen (f77nam)); }

int imopnc (char *nimage ,
             int o_im ,
             int *n_im ,
             int *ier	 ) 
{ imopnc_ (nimage, &o_im, n_im, ier, strlen(nimage)); }

int imopnx (char *image ,
             int acmode ,
             int *im ,
             int *ier	) 
{ imopnx_ (image, &acmode, im, ier, strlen(image)); }

int impixf (int im ,
             int *pixfd ,
             char *pixfil	,
             int *pixoff ,
             int *szline ,
             int *ier )	
{impixf_ (&im, &pixfd, pixfil, &pixoff, &szline, ier, SZ_OPNAME); 
	 sstrip (pixfil, SZ_OPNAME);}

int impkwb (int im ,
             char *keyw	,
             int bval ,
             int *ier ) 
{ impkwb_ (&im, keyw, &bval, ier, strlen(keyw)); }

int impkwc (int im ,
             char *keyw ,
             char *sval	,
             int *ier ) 
{ impkwc_ (&im, keyw, sval, ier, strlen(keyw)); }

int impkwd (int im ,
             char *keyw ,
             double dval	,
             int *ier ) 
{ impkwd_ (&im, keyw, &dval, ier, strlen(keyw)); }

int impkwi (int im ,
             char *keyw	,
             int ival ,
             int ier ) 
{ impkwi_ (&im, keyw, &ival, ier, strlen(keyw)); }

int impkwr (int im ,
             char *keyw ,
             float rval	,
             int *ier ) 
{ float f = rval; impkwr_ (&im, keyw, &f, ier, strlen(keyw)); }

int impl1r (int im ,
             float *buf	,
             int *ier ) 
{ impl1r_ (&im, buf, ier); }

int impl1s (int im ,
             short *buf	,
             int *ier ) 
{ impl1s_ (&im, buf, ier); }

int impl2r (int im ,
             float *buf	,
             int lineno ,
             int *ier ) 
{ impl2r_ (&im, buf, &lineno, ier); }

int impl2s (int im ,
             short *buf	,
             int lineno ,
             int *ier ) 
{ impl2s_ (&im, buf, &lineno, ier); }

int impl3r (int im ,
             float *buf	,
             int lineno ,
             int bandno ,
             int *ier )	
{ impl3r_ (&im, buf, &lineno, &bandno, ier); }

int impl3s (int im ,
             short *buf	,
             int lineno ,
             int bandno ,
             int *ier )	
{ impl3s_ (&im, buf, &lineno, &bandno, ier); }

int imps1r (int im ,
             float *buf	,
             int i1 ,
             int i2 ,
             int *ier ) 
{ imps1r_ (&im, buf, &i1, &i2, ier); }

int imps1s (int im ,
             short *buf	,
             int i1 ,
             int i2 ,
             int *ier ) 
{ imps1s_ (&im, buf, &i1, &i2, ier); }

int imps2r (int im ,
             float *buf	,
             int i1 ,
             int i2 ,
             int j1 ,
             int j2 ,
             int *ier )	
{ imps2r_ (&im, buf, &i1, &i2, &j1, &j2, ier); }

int imps2s (int im ,
             short *buf	,
             int i1 ,
             int i2 ,
             int j1 ,
             int j2 ,
             int *ier )	
{ imps2s_ (&im, buf, &i1, &i2, &j1, &j2, ier); }

int imps3r (int im ,
             float *buf	,
             int i1 ,
             int i2 ,
             int j1 ,
             int j2 ,
             int k1 ,
             int k2 ,
             int *ier )	
{ imps3r_ (&im, buf, &i1, &i2, &j1, &j2, &k1, &k2, ier); }

int imps3s (int im ,
             short *buf	,
             int i1 ,
             int i2 ,
             int j1 ,
             int j2 ,
             int k1 ,
             int k2 ,
             int *ier )	
{ imps3s_ (&im, buf, &i1, &i2, &j1, &j2, &k1, &k2, ier); }

int imrnam (char *oimage ,
             char *nimage ,
             int *ier	) 
{ imrnam_ (oimage, nimage, ier, strlen(oimage), strlen(nimage)); }

int imsdir (char *dir	) 
{ imsdir_ (dir, strlen (dir)); }

int imtypk (int im ,
             char *keyw ,
             int *dtype ,
             char *comm	,
             int *ier ) 
{ imtypk_ (&im, keyw, dtype, comm, ier, strlen(keyw), SZ_OPNAME); 
	   sstrip (comm, SZ_OPNAME);}

/* Support utility to trim trailing blanks from string and add
 * a null terminator.
 */

int sstrip (char outstr[SZ_OPNAME] ,
             int length ) 
{
	int i;
	for (i=length-1;
	    (outstr[i] == '\0' || outstr[i]  == ' ') && i >= 0; i--);
	if (i == length - 1)
	    outstr[i] = '\0';
	else
	    outstr[i+1] = '\0';
}
