/* Enumerated for data types in files */
enum {
eioREAL, eioFLOAT, eioDOUBLE, eioINT, eioINT32, eioINT64,
- eioUCHAR, eioCHAR, eioNUCHAR, eioUSHORT,
+ eioUCHAR, eioCHAR, eioNCHAR, eioNUCHAR, eioUSHORT,
eioRVEC, eioNRVEC, eioIVEC, eioSTRING, eioNR
};
static const char *eioNames[eioNR] =
{
"REAL", "FLOAT", "DOUBLE", "INT", "INT32", "INT64",
- "UCHAR", "CHAR", "NUCHAR", "USHORT",
+ "UCHAR", "CHAR", "NCHAR", "NUCHAR", "USHORT",
"RVEC", "NRVEC", "IVEC", "STRING"
};
/* check the number of items given against the type */
static void gmx_fio_check_nitem(int eio, int nitem, const char *file, int line)
{
- if ((nitem != 1) && !((eio == eioNRVEC) || (eio == eioNUCHAR)))
+ if ((nitem != 1) && !((eio == eioNRVEC) || (eio == eioNUCHAR) || (eio == eioNCHAR)))
{
gmx_fatal(FARGS,
- "nitem (%d) may differ from 1 only for %s or %s, not for %s"
+ "nitem (%d) may differ from 1 only for %s, %s or %s, not for %s"
"(%s, %d)", nitem, eioNames[eioNUCHAR], eioNames[eioNRVEC],
- eioNames[eio], file, line);
+ eioNames[eioNCHAR], eioNames[eio], file, line);
}
}
const char *desc, const char *srcfile, int line)
{
unsigned char ucdum, *ucptr;
- char cdum;
+ char cdum, *cptr;
bool_t res = 0;
float fvec[DIM];
double dvec[DIM];
*static_cast<char *>(item) = cdum;
}
break;
+ case eioNCHAR:
+ cptr = static_cast<char *>(item);
+ res = xdr_vector(fio->xdr, cptr, nitem,
+ static_cast<unsigned int>(sizeof(char)),
+ reinterpret_cast<xdrproc_t>(xdr_char));
+ break;
case eioNUCHAR:
ucptr = static_cast<unsigned char *>(item);
- res = 1;
- for (j = 0; (j < nitem) && res; j++)
- {
- res = xdr_u_char(fio->xdr, &(ucptr[j]));
- }
+ res = xdr_vector(fio->xdr, reinterpret_cast<char *>(ucptr), nitem,
+ static_cast<unsigned int>(sizeof(unsigned char)),
+ reinterpret_cast<xdrproc_t>(xdr_u_char));
break;
case eioUSHORT:
if (item && !fio->bRead)
return ret;
}
+gmx_bool gmx_fio_ndoe_char(t_fileio *fio, char *item, int n,
+ const char *desc, const char *srcfile, int line)
+{
+ gmx_bool ret = TRUE;
+ gmx_fio_lock(fio);
+ ret = ret && do_xdr(fio, item, n, eioNCHAR, desc, srcfile, line);
+ gmx_fio_unlock(fio);
+ return ret;
+}
gmx_bool gmx_fio_ndoe_ushort(t_fileio *fio, unsigned short *item, int n,
gmx_fio_do_rvec(fio_, *value);
}
+void FileIOXdrSerializer::doCharArray(char *values, int elements)
+{
+ gmx_fio_ndo_char(fio_, values, elements);
+}
+
+void FileIOXdrSerializer::doUCharArray(unsigned char *values, int elements)
+{
+ gmx_fio_ndo_uchar(fio_, values, elements);
+}
+
+void FileIOXdrSerializer::doRvecArray(rvec *values, int elements)
+{
+ gmx_fio_ndo_rvec(fio_, values, elements);
+}
+
void FileIOXdrSerializer::doString(std::string *value)
{
// TODO: Use an arbitrary length buffer (but that is not supported in
int line);
gmx_bool gmx_fio_ndoe_uchar(struct t_fileio *fio, unsigned char *item, int n,
const char *desc, const char *srcfile, int line);
+gmx_bool gmx_fio_ndoe_char(struct t_fileio *fio, char *item, int n,
+ const char *desc, const char *srcfile, int line);
gmx_bool gmx_fio_ndoe_ushort(struct t_fileio *fio, unsigned short *item, int n,
const char *desc, const char *srcfile, int line);
gmx_bool gmx_fio_ndoe_rvec(struct t_fileio *fio, rvec *item, int n,
#define gmx_fio_ndo_int32(fio, item, n) gmx_fio_ndoe_int32(fio, item, n, (#item), __FILE__, __LINE__)
#define gmx_fio_ndo_int64(fio, item, n) gmx_fio_ndoe_int64(fio, item, n, (#item), __FILE__, __LINE__)
#define gmx_fio_ndo_uchar(fio, item, n) gmx_fio_ndoe_uchar(fio, item, n, (#item), __FILE__, __LINE__)
+#define gmx_fio_ndo_char(fio, item, n) gmx_fio_ndoe_char(fio, item, n, (#item), __FILE__, __LINE__)
#define gmx_fio_ndo_ushort(fio, item, n) gmx_fio_ndoe_ushort(fio, item, n, (#item), __FILE__, __LINE__)
#define gmx_fio_ndo_rvec(fio, item, n) gmx_fio_ndoe_rvec(fio, item, n, (#item), __FILE__, __LINE__)
#define gmx_fio_ndo_ivec(fio, item, n) gmx_fio_ndoe_ivec(fio, item, n, (#item), __FILE__, __LINE__)
void doRvec(rvec *value) override;
//! Handle I/O if string.
void doString(std::string *value) override;
+ //! Special case for handling I/O of a vector of characters.
+ void doCharArray(char *values, int elements) override;
+ //! Special case for handling I/O of a vector of unsigned characters.
+ void doUCharArray(unsigned char *values, int elements) override;
+ //! Special case for handling I/O of a vector of rvecs.
+ void doRvecArray(rvec *values, int elements) override;
private:
//! File I/O handle.