/****h* H5f90kit/H5f90kit * PURPOSE * Routines from HDF4 to deal with C-FORTRAN issues: * * HD5f2cstring -- convert a Fortran string to a C string * HD5packFstring -- convert a C string into a Fortran string * * COPYRIGHT * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * All rights reserved. * * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * * the COPYING file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ****** */ #include #include #include "H5f90.h" /****if* H5f90kit/HDf2cstring * NAME * HD5f2cstring -- convert a Fortran string to a C string * char * HDf2cstring(fdesc, len) * INPUTS * _fcd fdesc; IN: Fortran string descriptor * int len; IN: length of Fortran string * RETURNS * Pointer to the C string if success, else NULL * PURPOSE * Chop off trailing blanks off of a Fortran string and * move it into a newly allocated C string. It is up * to the user to free this string. * SOURCE */ char * HD5f2cstring(_fcd fdesc, size_t len) /******/ { char *cstr; /* C string to return */ char *str; /* Pointer to FORTRAN string */ int i; /* Local index variable */ /* Search for the end of the string */ str = _fcdtocp(fdesc); for (i = (int)len - 1; i >= 0 && isspace((int)str[i]) && str[i] == ' '; i--) /*EMPTY*/; /* Allocate C string */ if (NULL == (cstr = (char *)malloc((size_t)(i + 2)))) return NULL; /* Copy text from FORTRAN to C string */ memcpy(cstr, str, (size_t)(i + 1)); /* Terminate C string */ cstr[i + 1] = '\0'; return cstr; } /* HD5f2cstring */ /****if* H5f90kit/HD5packFstring * NAME * HD5packFstring -- convert a C string into a Fortran string * int HD5packFstring(src, dest, len) * INPUTS * char * src; IN: source string * int len; IN: length of string * OUTPUTS * char * dest; OUT: destination * RETURNS * SUCCEED / FAIL * PURPOSE * given a NULL terminated C string 'src' convert it to * a space padded Fortran string 'dest' of length 'len' * * This is very similar to HDc2fstr except that function does * it in place and this one copies. We should probably only * support one of these. * SOURCE */ void HD5packFstring(char *src, char *dest, size_t dst_len) /******/ { size_t src_len = strlen(src); /* Copy over the string information, up to the length of the src */ /* (Don't copy the NUL terminator from the C string to the FORTRAN string */ memcpy(dest, src, MIN(src_len, dst_len)); /* Pad out any remaining space in the FORTRAN string with ' 's */ if (src_len < dst_len) memset(&dest[src_len], ' ', dst_len - src_len); } /* HD5packFstring */