-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathedslib_database_ops.c
More file actions
131 lines (121 loc) · 4.66 KB
/
Copy pathedslib_database_ops.c
File metadata and controls
131 lines (121 loc) · 4.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
* LEW-19710-1, CCSDS SOIS Electronic Data Sheet Implementation
*
* Copyright (c) 2020 United States Government as represented by
* the Administrator of the National Aeronautics and Space Administration.
* All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* \file edslib_database_ops.c
* \ingroup fsw
* \author joseph.p.hickey@nasa.gov
*
* Internal API functions for dealing with the EDS-defined type identifiers
* that are used in the external API. These are safe indices into the internal database,
* which can be converted into a pointer into the DB.
*
* Since the index value can be checked and verified before actually dereferencing the
* data, it is safer to use than a direct memory pointer. However all internal API calls
* generally pass around direct DB object pointers for efficiency.
*
* This is linked as part of the "basic" EDS library
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "edslib_database_ops.h"
/*----------------------------------------------------------------
*
* EdsLib internal function
* See description in header file for argument/return detail
*
* This converts between the EdsLib_Id_t used in the public API, and
* the EdsLib_DatabaseRef_t used in the internal DB.
*
*-----------------------------------------------------------------*/
void EdsLib_Decode_StructId(EdsLib_DatabaseRef_t *RefObj, EdsLib_Id_t EdsId)
{
RefObj->AppIndex = EdsLib_Get_AppIdx(EdsId);
RefObj->SubIndex = EdsLib_Get_FormatIdx(EdsId);
switch (EdsLib_Get_Genre(EdsId))
{
case EDSLIB_ID_GENRE_DATATYPE_BITS:
RefObj->Qualifier = EdsLib_DbRef_Qualifier_DATATYPE;
break;
case EDSLIB_ID_GENRE_INTF_BITS:
RefObj->Qualifier = EdsLib_DbRef_Qualifier_INTERFACE;
break;
case EDSLIB_ID_GENRE_USERDEF1_BITS:
RefObj->Qualifier = EdsLib_DbRef_Qualifier_USERDEF1;
break;
case EDSLIB_ID_GENRE_USERDEF2_BITS:
RefObj->Qualifier = EdsLib_DbRef_Qualifier_USERDEF2;
break;
default:
/* Unspecified qualifier (this could be a problem) */
RefObj->Qualifier = EdsLib_DbRef_Qualifier_UNSPECIFIED;
break;
}
}
/*----------------------------------------------------------------
*
* EdsLib internal function
* See description in header file for argument/return detail
*
* This converts between the EdsLib_Id_t used in the public API, and
* the EdsLib_DatabaseRef_t used in the internal DB.
*
*-----------------------------------------------------------------*/
EdsLib_Id_t EdsLib_Encode_StructId(const EdsLib_DatabaseRef_t *RefObj)
{
EdsLib_Id_t Result;
Result = EDSLIB_ID_INVALID;
if (RefObj != NULL && RefObj->Qualifier != EdsLib_DbRef_Qualifier_UNSPECIFIED)
{
EdsLib_Set_AppIdx(&Result, RefObj->AppIndex);
EdsLib_Set_FormatIdx(&Result, RefObj->SubIndex);
switch (RefObj->Qualifier)
{
case EdsLib_DbRef_Qualifier_DATATYPE:
EdsLib_Set_Genre(&Result, EDSLIB_ID_GENRE_DATATYPE_BITS);
break;
case EdsLib_DbRef_Qualifier_INTERFACE:
EdsLib_Set_Genre(&Result, EDSLIB_ID_GENRE_INTF_BITS);
break;
case EdsLib_DbRef_Qualifier_USERDEF1:
EdsLib_Set_Genre(&Result, EDSLIB_ID_GENRE_USERDEF1_BITS);
break;
case EdsLib_DbRef_Qualifier_USERDEF2:
EdsLib_Set_Genre(&Result, EDSLIB_ID_GENRE_USERDEF2_BITS);
break;
default:
/* Unspecified qualifier (this could be a problem) */
break;
}
}
return Result;
}
/*----------------------------------------------------------------
*
* EdsLib internal function
* See description in header file for argument/return detail
*
*-----------------------------------------------------------------*/
bool EdsLib_DatabaseRef_IsEqual(const EdsLib_DatabaseRef_t *RefObj1, const EdsLib_DatabaseRef_t *RefObj2)
{
return (RefObj1->Qualifier == RefObj2->Qualifier && RefObj1->AppIndex == RefObj2->AppIndex
&& RefObj1->SubIndex == RefObj2->SubIndex);
}