#ident "@(#) read_idf_mem.c 1.2 05/08/19 SwRI" #include /* for strdup */ #include "old_idf_defs.h" #include "old_local_defs.h" #include "old_vidf_str.h" #include "vidf_codes.h" #include "SDDAS_types.h" /******************************************************************************* * * * READ_IDF_MEMORY SUBROUTINE * * * * DESCRIPTION * * This routine is called to retrieve information from the VIDF definition * * file, which is held in memory, for the data set specified. * * * * INPUT VARIABLES * * SDDAS_CHAR *var output value(s) associated with selected * * field * * SDDAS_SHORT quan specified field in VIDF file * * SDDAS_SHORT num the table or constant definition from * * which the required field is to be retrieved * * SDDAS_SHORT len if the selected field is an array, this is * * the number of elements to be returned * * SDDAS_LONG start if the selected field is an array, this is * * the starting position in the array * * * * USAGE * * x = read_idf_memory (VIDF_INFO, &var, quan, num, start, len) * * * * NECESSARY SUBPROGRAMS * * memcpy () copies bytes from one memory area to another * * * * EXTERNAL VARIABLES * * SDDAS_SHORT ir_size[] the size of each field (1byte, 2bytes, etc) * * * * INTERNAL VARIABLES * * register SDDAS_LONG *l1 pointer to offset values * * SDDAS_LONG bytes the number of bytes to access for the field * * SDDAS_LONG avail_bytes the number of bytes that can be accessed * * for the field in question * * SDDAS_LONG upper used to determine the number of bytes to * * process * * SDDAS_LONG to_data offset into the VIDF data array * * SDDAS_LONG Telem offset to get to table elements * * SDDAS_SHORT lsize the size of the element being requested * * SDDAS_CHAR *data pointer to the VIDF data held in memory * * char type flag indicating if the field is identified * * with a table, a constant or neither * * * * SUBSYSTEM * * Display Level * * * ******************************************************************************/ SDDAS_LONG read_idf_memory (vidf_info *VIDF_INFO, SDDAS_CHAR *var, SDDAS_SHORT quan, SDDAS_SHORT num, SDDAS_LONG start, SDDAS_SHORT len) { extern SDDAS_SHORT ir_size[]; register SDDAS_LONG *l1; SDDAS_LONG bytes, avail_bytes, upper, to_data, Telem; SDDAS_SHORT lsize; SDDAS_CHAR *data; char tbl_type, type; int i, max_str_len; char **sptrs = (char **)var; /**************************************************************************/ /* The ex structure of interest has been found by READ_IDF already. */ /**************************************************************************/ Telem = _CONST_ID - _TBL_SCA_SZ; type = (quan < _TBL_SCA_SZ) ? 0 : (quan < _CONST_ID) ? 1 : 2; if ((quan == _MISSION) || (quan == _SPACECRAFT) || (quan == _EXP_DESC) || (quan == _INST_DESC) || (quan == _CONTACT) || (quan == _QUAL_NAME) || (quan == _SEN_NAME) || (quan == _STATUS_NAME) || (quan == _CAL_NAMES)) { type = 3; /* long string pointer */ max_str_len = 80; } else if ((quan == _PA_PROJECT) || (quan == _PA_MISSION) || (quan == _PA_EXPER) || (quan == _PA_INST) || (quan == _PA_VINST)) { type = 3; /* short string pointer */ max_str_len = 21; } switch (type) { case 3: upper = VIDF_INFO->offsets[quan+1]; avail_bytes = upper - VIDF_INFO->offsets[quan]; if (len > 0) { bytes = ir_size[quan] * len; if (avail_bytes < bytes) return (IDF_MANY_BYTES); } else { bytes = avail_bytes; if (bytes == 0) return (IDF_NO_ENTRY); } to_data = VIDF_INFO->offsets[quan] + ir_size[quan] * start; data = (SDDAS_CHAR *) VIDF_INFO->vidf_data + to_data; for (i = 0; i < bytes / max_str_len; i++) { sptrs [i] = &(data [(num + i) * max_str_len]); } break; case 0: upper = VIDF_INFO->offsets[quan+1]; avail_bytes = upper - VIDF_INFO->offsets[quan]; if (len > 0) { bytes = ir_size[quan] * len; if (avail_bytes < bytes) return (IDF_MANY_BYTES); } else { bytes = avail_bytes; if (bytes == 0) return (IDF_NO_ENTRY); } to_data = VIDF_INFO->offsets[quan] + ir_size[quan] * start; data = (SDDAS_CHAR *) VIDF_INFO->vidf_data + to_data; memcpy (var, data, bytes); break; case 1: if (num > VIDF_INFO->TABLES - 1) return (IDF_TBL_NUM); l1 = (SDDAS_LONG *) VIDF_INFO->tbl_offs + Telem * num + _TBL_TYPE - _TBL_SCA_SZ; tbl_type = *((SDDAS_CHAR *) VIDF_INFO->vidf_data + *l1); if (quan == _TBL) lsize = (tbl_type == 1) ? 21 : ir_size[quan]; else lsize = ir_size[quan]; l1 = (SDDAS_LONG *) VIDF_INFO->tbl_offs + Telem * num + quan - _TBL_SCA_SZ; upper = *(l1 + 1); avail_bytes = upper - *l1; if (len > 0) { bytes = lsize * len; if (avail_bytes < bytes) return (IDF_MANY_BYTES); } else { bytes = avail_bytes; if (bytes == 0) return (IDF_NO_ENTRY); } to_data = *l1 + lsize * start; data = (SDDAS_CHAR *) VIDF_INFO->vidf_data + to_data; /* memcpy (var, data, bytes); */ if ((tbl_type == 1) && (quan == _TBL)) { for (i = 0; i < bytes / 21; i++) { sptrs [i] = &(data [i * 21]); } } else { memcpy (var, data, bytes); } break; case 2: if (num > VIDF_INFO->CONSTS - 1) return (IDF_CON_NUM); l1 = (SDDAS_LONG *) VIDF_INFO->const_offs + 5 * num + quan - _CONST_ID; upper = *(l1 + 1); avail_bytes = upper - *l1; if (len > 0) { bytes = ir_size[quan] * len; if (avail_bytes < bytes) return (IDF_MANY_BYTES); } else { bytes = avail_bytes; if (bytes == 0) return (IDF_NO_ENTRY); } to_data = *l1 + ir_size[quan] * start; data = (SDDAS_CHAR *) VIDF_INFO->vidf_data + to_data; memcpy (var, data, bytes); break; } return (ALL_OKAY); }