/* * Adds to a particular unit-system a mapping from an identifier to a unit. * * Arguments: * systemMap Address of the pointer to the system-map. * id Pointer to the identifier. May be freed upon return. * unit Pointer to the unit. May be freed upon return. * compare Pointer to comparison function for unit-identifiers. * Returns: * UT_BAD_ARG "id" is NULL or "unit" is NULL. * UT_OS Operating-sytem failure. See "errno". * UT_SUCCESS Success. */ static ut_status mapIdToUnit( SystemMap** const systemMap, const char* const id, const ut_unit* const unit, int (*compare)(const void*, const void*)) { ut_status status = UT_SUCCESS; if (id == NULL) { status = UT_BAD_ARG; } else if (unit == NULL) { status = UT_BAD_ARG; } else { ut_system* system = ut_get_system(unit); if (*systemMap == NULL) { *systemMap = smNew(); if (*systemMap == NULL) status = UT_OS; } if (*systemMap != NULL) { IdToUnitMap** const idToUnit = (IdToUnitMap**)smSearch(*systemMap, system); if (idToUnit == NULL) { status = UT_OS; } else { if (*idToUnit == NULL) { *idToUnit = itumNew(compare); if (*idToUnit == NULL) status = UT_OS; } if (*idToUnit != NULL) status = itumAdd(*idToUnit, id, unit); } /* have system-map entry */ } /* have system-map */ } /* valid arguments */ return status; }
/* * Adds an entry to the unit-to-identifier map associated with a unit-system. * * Arguments: * sytemMap Address of the pointer to the * system-to-unit-to-identifier map. * unit The unit. May be freed upon return. * id The identifier. May be freed upon return. * encoding The ostensible encoding of "id". * Returns: * UT_BAD_ARG "unit" or "id" is NULL, or "id" is inconsistent with * "encoding". * UT_OS Operating-system error. See "errno". * UT_EXISTS "unit" already maps to a different identifier. * UT_SUCCESS Success. */ static ut_status mapUnitToId( SystemMap** const systemMap, const ut_unit* const unit, const char* const id, ut_encoding encoding) { ut_status status; assert(systemMap != NULL); if (unit == NULL || id == NULL) { status = UT_BAD_ARG; } else { if (*systemMap == NULL) { *systemMap = smNew(); if (*systemMap == NULL) status = UT_OS; } if (*systemMap != NULL) { UnitToIdMap** const unitToIdMap = (UnitToIdMap**)smSearch(*systemMap, ut_get_system(unit)); if (unitToIdMap == NULL) { status = UT_OS; } else { if (*unitToIdMap == NULL) { *unitToIdMap = utimNew(); if (*unitToIdMap == NULL) status = UT_OS; } if (*unitToIdMap != NULL) status = utimAdd(*unitToIdMap, unit, id, encoding); } } } return status; }