blob: f206978572604a33210f5d66057026641395bdf5 [file] [log] [blame]
/* --COPYRIGHT--,ESD
* Copyright (c) 2016-2018 Texas Instruments Incorporated
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License
* v. 1.0 which accompanies this distribution. The Eclipse Public License is
* available at http://www.eclipse.org/legal/epl-v10.html and the Eclipse
* Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Texas Instruments - initial implementation
* --/COPYRIGHT--*/
/*
* ======== Registry.c ========
*/
#include <xdc/runtime/Types.h>
#include <xdc/runtime/Text.h>
#include <string.h>
#include "package/internal/Registry.xdc.h"
/* Min and max registry module ids, inclusive. */
#define MAXMID Text_registryModsLastId
#define MINMID (Text_unnamedModsLastId + 1U)
/*
* ======== Registry_addModule ========
*/
Registry_Result Registry_addModule(Registry_Desc *desc, CString modName)
{
/* First, verify the module has not already been added to the module. */
if (Registry_findByName(modName) != NULL) {
return (Registry_ALREADY_ADDED);
}
/* First verify there are more module ids available. */
if (Registry_module->curId == (Types_ModuleId)MINMID) {
return (Registry_ALL_IDS_USED);
}
/* Create a new "registry" module */
/* Fill out the descriptor. */
desc->id = Registry_module->curId;
Registry_module->curId--;
desc->modName = modName;
/*
* Initialize the new module's mask with the runtime values of the
* Registry mask. This will enable any bits which are RUNTIME_ON.
*/
desc->mask = Registry_Module_getMask();
/* Add the descriptor to the current list. */
desc->next = Registry_module->listHead;
Registry_module->listHead = desc;
return (Registry_SUCCESS);
}
/*
* ======== Registry_findByName ========
*/
Registry_Desc *Registry_findByName(CString name)
{
return (Registry_findByNameInList(name, Registry_module->listHead));
}
/*
* ======== Registry_findByNameInList ========
*/
Registry_Desc *Registry_findByNameInList(CString name,
Registry_Desc *listHead)
{
Registry_Desc *dp;
for (dp = listHead; dp != NULL; dp = dp->next) {
if (strcmp(dp->modName, name) == 0) {
return (dp);
}
}
return (NULL);
}
/*
* ======== Registry_findByNamePattern ========
*/
Registry_Desc *Registry_findByNamePattern(CString namePat, UShort len,
Registry_Desc *prev)
{
Registry_Desc *dp;
/*
* Determine where to start in the list.
* If this is the first call, start at the head.
*/
if (prev == NULL) {
dp = Registry_module->listHead;
}
/* Otherwise, start where we left off. */
else {
dp = prev->next;
}
/* Loop through the modules. */
for (; dp != NULL; dp = dp->next) {
/* If the module's name matches the pattern, return the descriptor. */
if (Registry_matchPattern(namePat, len, dp->modName) != FALSE) {
return (dp);
}
}
return (NULL);
}
/*
* ======== matchPattern ========
* Determines whether a given module name matches a given pattern.
*/
Bool Registry_matchPattern(CString pattern, UShort len, CString modName)
{
/*
* Move through both strings one character at a time.
* Break when:
* 1. The characters don't match, but the pattern character is the
* wildcard, so the strings match.
* 2. The characters don't match, and the pattern character is not
* the wildcard, so the strings don't match.
* 3. We've reached the end of the pattern.
*/
while (len-- > 0U) {
if (*pattern != *modName) {
/*
* If the next character in 'pattern' is the wildcard, then the
* module name matches.
*/
return ((Bool)(*pattern == '%'));
}
/* Move to the next character in the strings */
pattern++;
modName++;
}
/*
* We've reached the end of the pattern. If we've also reached the end
* of the module name, then we have a match.
*/
return ((Bool)(*modName == '\0'));
}
/*
* ======== Registry_findById ========
*/
Registry_Desc *Registry_findById(Types_ModuleId mid)
{
Registry_Desc *dp;
for (dp = Registry_module->listHead; dp != NULL; dp = dp->next) {
if (dp->id == mid) {
return (dp);
}
}
return (NULL);
}
/*
* ======== Registry_getMask ========
*/
Bool Registry_getMask(CString name, Types_DiagsMask *mask)
{
Registry_Desc *dp = Registry_findByName(name);
if (dp != NULL) {
*mask = dp->mask;
return (TRUE);
}
return (FALSE);
}
/*
* ======== Registry_isMember ========
*/
Bool Registry_isMember(Types_ModuleId mid)
{
return ((Bool)(mid <= MAXMID && mid >= MINMID));
}
/*
* ======== Registry_getNextModule ========
*/
Registry_Desc *Registry_getNextModule(Registry_Desc *desc)
{
if (desc == NULL) {
return (Registry_module->listHead);
}
else {
return (desc->next);
}
}
/*
* ======== getModuleName ========
*/
CString Registry_getModuleName(Registry_Desc *desc)
{
return (desc->modName);
}
/*
* ======== getModuleId ========
*/
Types_ModuleId Registry_getModuleId(Registry_Desc *desc)
{
return (desc->id);
}