From d962bcbf1c9296f3ed1685f04afd3fd794abf314 Mon Sep 17 00:00:00 2001 From: Giel van Schijndel Date: Thu, 1 May 2008 20:25:20 +0000 Subject: [PATCH] * Use a nice & easy to maintain string to enum mapping-array and utilise a for-loop to fetch the correct value from it (instead of a huge amount of code repetition) * Some const correctness git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@4873 4a71c877-e1ca-e34f-864e-861f7616d084 --- src/structure.c | 148 ++++++++++++++---------------------------------- 1 file changed, 41 insertions(+), 107 deletions(-) diff --git a/src/structure.c b/src/structure.c index 06a2e2d27..2961a8073 100644 --- a/src/structure.c +++ b/src/structure.c @@ -342,118 +342,52 @@ void resetFactoryNumFlag(void) } } -static void structureType(STRUCTURE_STATS *pStructure, char *pType) +static const struct { - if (!strcmp(pType,"HQ")) + const char* typeName; + STRUCTURE_TYPE type; +} structureTypeNames[] = +{ + { "HQ", REF_HQ }, + { "FACTORY", REF_FACTORY }, + { "FACTORY MODULE", REF_FACTORY_MODULE }, + { "RESEARCH", REF_RESEARCH }, + { "RESEARCH MODULE", REF_RESEARCH_MODULE }, + { "POWER GENERATOR", REF_POWER_GEN }, + { "POWER MODULE", REF_POWER_MODULE }, + { "RESOURCE EXTRACTOR", REF_RESOURCE_EXTRACTOR }, + { "DEFENSE", REF_DEFENSE }, + { "WALL", REF_WALL }, + { "CORNER WALL", REF_WALLCORNER }, + { "REPAIR FACILITY", REF_REPAIR_FACILITY }, + { "COMMAND RELAY", REF_COMMAND_CONTROL }, + { "DEMOLISH", REF_DEMOLISH }, + { "CYBORG FACTORY", REF_CYBORG_FACTORY }, + { "VTOL FACTORY", REF_VTOL_FACTORY }, + { "LAB", REF_LAB }, + { "DOOR", REF_BLASTDOOR }, + { "REARM PAD", REF_REARM_PAD }, + { "MISSILE SILO", REF_MISSILE_SILO }, + { "SAT UPLINK", REF_SAT_UPLINK }, +}; + +static STRUCTURE_TYPE structureType(const char* typeName) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(structureTypeNames); ++i) { - pStructure->type = REF_HQ; - return; + if (strcmp(typeName, structureTypeNames[i].typeName) == 0) + { + return structureTypeNames[i].type; + } } - if (!strcmp(pType,"FACTORY")) - { - pStructure->type = REF_FACTORY; - return; - } - if (!strcmp(pType,"FACTORY MODULE")) - { - pStructure->type = REF_FACTORY_MODULE; - return; - } - if (!strcmp(pType,"RESEARCH")) - { - pStructure->type = REF_RESEARCH; - return; - } - if (!strcmp(pType,"RESEARCH MODULE")) - { - pStructure->type = REF_RESEARCH_MODULE; - return; - } - if (!strcmp(pType,"POWER GENERATOR")) - { - pStructure->type = REF_POWER_GEN; - return; - } - if (!strcmp(pType,"POWER MODULE")) - { - pStructure->type = REF_POWER_MODULE; - return; - } - if (!strcmp(pType, "RESOURCE EXTRACTOR")) - { - pStructure->type = REF_RESOURCE_EXTRACTOR; - return; - } - if (!strcmp(pType, "DEFENSE")) - { - pStructure->type = REF_DEFENSE; - return; - } - if (!strcmp(pType, "WALL")) - { - pStructure->type = REF_WALL; - return; - } - if (!strcmp(pType, "CORNER WALL")) - { - pStructure->type = REF_WALLCORNER; - return; - } - if (!strcmp(pType, "REPAIR FACILITY")) - { - pStructure->type = REF_REPAIR_FACILITY; - return; - } - if (!strcmp(pType, "COMMAND RELAY")) - { - pStructure->type = REF_COMMAND_CONTROL; - return; - } - if (!strcmp(pType, "DEMOLISH")) - { - pStructure->type = REF_DEMOLISH; - return; - } - if (!strcmp(pType, "CYBORG FACTORY")) - { - pStructure->type = REF_CYBORG_FACTORY; - return; - } - if (!strcmp(pType, "VTOL FACTORY")) - { - pStructure->type = REF_VTOL_FACTORY; - return; - } - if (!strcmp(pType, "LAB")) - { - pStructure->type = REF_LAB; - return; - } - if (!strcmp(pType, "DOOR")) - { - pStructure->type = REF_BLASTDOOR; - return; - } - if (!strcmp(pType, "REARM PAD")) - { - pStructure->type = REF_REARM_PAD; - return; - } - if (!strcmp(pType, "MISSILE SILO")) - { - pStructure->type = REF_MISSILE_SILO; - return; - } - if (!strcmp(pType, "SAT UPLINK")) - { - pStructure->type = REF_SAT_UPLINK; - return; - } - ASSERT(!"unknown structure type", "structureType: Unknown Structure Type"); + + ASSERT(!"unknown structure type", "Unknown Structure Type (%s)", typeName); } -static const char *getStructName(STRUCTURE_STATS *psStruct) +static const char* getStructName(const STRUCTURE_STATS* psStruct) { return getName(psStruct->pName); } @@ -665,7 +599,7 @@ BOOL loadStructureStats(const char *pStructData, UDWORD bufferSize) psStructure->ref = REF_STRUCTURE_START + i; //determine the structure type - structureType(psStructure, type); + psStructure->type = structureType(type); //determine the tech level if (!setTechLevel((BASE_STATS *)psStructure, techLevel))