From 58bc3294fabaa71ab777745acd707f5c8ca67777 Mon Sep 17 00:00:00 2001 From: James R Date: Wed, 21 Sep 2022 12:27:16 -0700 Subject: [PATCH] Refactor R_ParseSpriteInfo Splits up the function, thus makes me want to kill myself less. --- src/r_picformats.c | 145 +++++++++++++++++++++++++++------------------ 1 file changed, 87 insertions(+), 58 deletions(-) diff --git a/src/r_picformats.c b/src/r_picformats.c index de9bb4857..deb2bcfde 100644 --- a/src/r_picformats.c +++ b/src/r_picformats.c @@ -1396,12 +1396,56 @@ boolean Picture_PNGDimensions(UINT8 *png, INT32 *width, INT32 *height, INT16 *to #endif #endif -// -// R_ParseSpriteInfoFrame -// -// Parse a SPRTINFO frame. -// -static void R_ParseSpriteInfoFrame(spriteinfo_t *info) +struct ParseSpriteInfoState { + boolean spr2; + spriteinfo_t *info; + spritenum_t sprnum; + playersprite_t spr2num; + INT32 skinnumbers[MAXSKINS]; + INT32 foundskins; +}; + +static void R_ParseSpriteInfoSkin(struct ParseSpriteInfoState *parser) +{ + char *sprinfoToken; + size_t sprinfoTokenLength; + + INT32 skinnum; + char *skinName = NULL; + + // Skin name + sprinfoToken = M_GetToken(NULL); + if (sprinfoToken == NULL) + { + I_Error("Error parsing SPRTINFO lump: Unexpected end of file where skin frame should be"); + } + + // copy skin name yada yada + sprinfoTokenLength = strlen(sprinfoToken); + skinName = (char *)Z_Malloc((sprinfoTokenLength+1)*sizeof(char),PU_STATIC,NULL); + M_Memcpy(skinName,sprinfoToken,sprinfoTokenLength*sizeof(char)); + skinName[sprinfoTokenLength] = '\0'; + strlwr(skinName); + + skinnum = R_SkinAvailable(skinName); + if (skinnum == -1) + I_Error("Error parsing SPRTINFO lump: Unknown skin \"%s\"", skinName); + + parser->skinnumbers[parser->foundskins] = skinnum; + parser->foundskins++; + + Z_Free(sprinfoToken); +} + +static void copy_to_skin (struct ParseSpriteInfoState *parser, INT32 skinnum) +{ + skin_t *skin = &skins[skinnum]; + spriteinfo_t *sprinfo = skin->sprinfo; + + M_Memcpy(&sprinfo[parser->spr2num], parser->info, sizeof(spriteinfo_t)); +} + +static void R_ParseSpriteInfoFrame(struct ParseSpriteInfoState *parser) { char *sprinfoToken; size_t sprinfoTokenLength; @@ -1480,9 +1524,26 @@ static void R_ParseSpriteInfoFrame(spriteinfo_t *info) } // set fields - info->pivot[frameFrame].x = frameXPivot; - info->pivot[frameFrame].y = frameYPivot; - info->pivot[frameFrame].rotaxis = frameRotAxis; + parser->info->pivot[frameFrame].x = frameXPivot; + parser->info->pivot[frameFrame].y = frameYPivot; + parser->info->pivot[frameFrame].rotaxis = frameRotAxis; + + if (parser->spr2) + { + INT32 i; + + if (!parser->foundskins) + I_Error("Error parsing SPRTINFO lump: No skins specified in this sprite2 definition"); + + for (i = 0; i < parser->foundskins; i++) + { + copy_to_skin(parser, parser->skinnumbers[i]); + } + } + else + { + M_Memcpy(&spriteinfo[parser->sprnum], parser->info, sizeof(spriteinfo_t)); + } } // @@ -1492,15 +1553,18 @@ static void R_ParseSpriteInfoFrame(spriteinfo_t *info) // static void R_ParseSpriteInfo(boolean spr2) { - spriteinfo_t *info; char *sprinfoToken; size_t sprinfoTokenLength; char newSpriteName[5]; // no longer dynamically allocated - spritenum_t sprnum = NUMSPRITES; - playersprite_t spr2num = NUMPLAYERSPRITES; + + struct ParseSpriteInfoState parser = { + .spr2 = spr2, + .sprnum = NUMSPRITES, + .spr2num = NUMPLAYERSPRITES, + .foundskins = 0, + }; + INT32 i; - INT32 skinnumbers[MAXSKINS]; - INT32 foundskins = 0; // Sprite name sprinfoToken = M_GetToken(NULL); @@ -1508,6 +1572,7 @@ static void R_ParseSpriteInfo(boolean spr2) { I_Error("Error parsing SPRTINFO lump: Unexpected end of file where sprite name should be"); } + sprinfoTokenLength = strlen(sprinfoToken); if (sprinfoTokenLength != 4) { @@ -1520,6 +1585,7 @@ static void R_ParseSpriteInfo(boolean spr2) // ^^ we've confirmed that the token is == 4 characters so it will never overflow a 5 byte char buffer strupr(newSpriteName); // Just do this now so we don't have to worry about it } + Z_Free(sprinfoToken); if (!spr2) @@ -1530,7 +1596,7 @@ static void R_ParseSpriteInfo(boolean spr2) I_Error("Error parsing SPRTINFO lump: Unknown sprite name \"%s\"", newSpriteName); if (!memcmp(newSpriteName,sprnames[i],4)) { - sprnum = i; + parser.sprnum = i; break; } } @@ -1543,15 +1609,15 @@ static void R_ParseSpriteInfo(boolean spr2) I_Error("Error parsing SPRTINFO lump: Unknown sprite2 name \"%s\"", newSpriteName); if (!memcmp(newSpriteName,spr2names[i],4)) { - spr2num = i; + parser.spr2num = i; break; } } } // allocate a spriteinfo - info = Z_Calloc(sizeof(spriteinfo_t), PU_STATIC, NULL); - info->available = true; + parser.info = Z_Calloc(sizeof(spriteinfo_t), PU_STATIC, NULL); + parser.info->available = true; // Left Curly Brace sprinfoToken = M_GetToken(NULL); @@ -1571,53 +1637,16 @@ static void R_ParseSpriteInfo(boolean spr2) { if (stricmp(sprinfoToken, "SKIN")==0) { - INT32 skinnum; - char *skinName = NULL; if (!spr2) I_Error("Error parsing SPRTINFO lump: \"SKIN\" token found outside of a sprite2 definition"); Z_Free(sprinfoToken); - - // Skin name - sprinfoToken = M_GetToken(NULL); - if (sprinfoToken == NULL) - { - I_Error("Error parsing SPRTINFO lump: Unexpected end of file where skin frame should be"); - } - - // copy skin name yada yada - sprinfoTokenLength = strlen(sprinfoToken); - skinName = (char *)Z_Malloc((sprinfoTokenLength+1)*sizeof(char),PU_STATIC,NULL); - M_Memcpy(skinName,sprinfoToken,sprinfoTokenLength*sizeof(char)); - skinName[sprinfoTokenLength] = '\0'; - strlwr(skinName); - Z_Free(sprinfoToken); - - skinnum = R_SkinAvailable(skinName); - if (skinnum == -1) - I_Error("Error parsing SPRTINFO lump: Unknown skin \"%s\"", skinName); - - skinnumbers[foundskins] = skinnum; - foundskins++; + R_ParseSpriteInfoSkin(&parser); } else if (stricmp(sprinfoToken, "FRAME")==0) { - R_ParseSpriteInfoFrame(info); Z_Free(sprinfoToken); - if (spr2) - { - if (!foundskins) - I_Error("Error parsing SPRTINFO lump: No skins specified in this sprite2 definition"); - for (i = 0; i < foundskins; i++) - { - size_t skinnum = skinnumbers[i]; - skin_t *skin = &skins[skinnum]; - spriteinfo_t *sprinfo = skin->sprinfo; - M_Memcpy(&sprinfo[spr2num], info, sizeof(spriteinfo_t)); - } - } - else - M_Memcpy(&spriteinfo[sprnum], info, sizeof(spriteinfo_t)); + R_ParseSpriteInfoFrame(&parser); } else { @@ -1636,7 +1665,7 @@ static void R_ParseSpriteInfo(boolean spr2) I_Error("Error parsing SPRTINFO lump: Expected \"{\" for sprite \"%s\", got \"%s\"",newSpriteName,sprinfoToken); } Z_Free(sprinfoToken); - Z_Free(info); + Z_Free(parser.info); } //