[geany/geany] e5e2a2: Replace unhygienic macro calls with array of struct

Nick Treleaven git-noreply at xxxxx
Sat Oct 5 11:31:09 UTC 2019


Branch:      refs/heads/build-exec
Author:      Nick Treleaven <n at trelsoft.com>
Committer:   Nick Treleaven <n at trelsoft.com>
Date:        Sat, 05 Oct 2019 11:31:09 UTC
Commit:      e5e2a28dac912a1483194b445620efbae0dbb7b0
             https://github.com/geany/geany/commit/e5e2a28dac912a1483194b445620efbae0dbb7b0

Log Message:
-----------
Replace unhygienic macro calls with array of struct


Modified Paths:
--------------
    src/build.c

Modified: src/build.c
79 lines changed, 49 insertions(+), 30 deletions(-)
===================================================================
@@ -349,14 +349,13 @@ static void printfcmds(void)
 }
 
 
-// Note: reads below and cmdindex parameters
-#define BREAK_IF_CMD(src, cmds, outsrc, outcmds) \
-	if ((src) < (below) && (cmds) != NULL && (cmds)[cmdindex].exists) \
-	{	outsrc = src; \
-		outcmds = cmds; \
-		break; \
-	}
+typedef struct CommandSet
+{
+	GeanyBuildSource src;
+	GeanyBuildCommand *cmds;
+} CommandSet;
 
+// Note: Could return CommandSet instead of using psrc
 /* get the next lowest command taking priority into account
  * below = only consider GeanyBuildSource values less than this parameter
  * psrc = Address to write GeanyBuildSource */
@@ -374,41 +373,61 @@ static GeanyBuildCommand *get_next_build_cmd(GeanyDocument *doc,
 	
 	GeanyFiletypePrivate empty_ftp = {}, *ftp =
 		doc ? doc->file_type->priv : &empty_ftp; // avoid checking for null
-	GeanyBuildSource src;
-	GeanyBuildCommand *cmds = NULL;
+	CommandSet overloads[6] = {};
 
 	switch (cmdgrp)
 	{
-		case GEANY_GBG_FT: /* order proj ft, home ft, ft, defft */
-			BREAK_IF_CMD(GEANY_BCS_PROJ,	ftp->projfilecmds,	src, cmds);
-			BREAK_IF_CMD(GEANY_BCS_PREF,	ftp->homefilecmds,	src, cmds);
-			BREAK_IF_CMD(GEANY_BCS_FT,		ftp->filecmds,		src, cmds);
-			BREAK_IF_CMD(GEANY_BCS_DEF,		ft_def,				src, cmds);
+		case GEANY_GBG_FT: /* order proj ft, home ft, ft, def ft */
+		{
+			CommandSet cs[] = {
+				{GEANY_BCS_PROJ,	ftp->projfilecmds},
+				{GEANY_BCS_PREF,	ftp->homefilecmds},
+				{GEANY_BCS_FT,		ftp->filecmds},
+				{GEANY_BCS_DEF,		ft_def},
+			};
+			memcpy(overloads, cs, sizeof(cs));
 			break;
+		}
 		case GEANY_GBG_NON_FT: /* order proj, pref, def */
-			BREAK_IF_CMD(GEANY_BCS_PROJ,	non_ft_proj,		src, cmds);
-			BREAK_IF_CMD(GEANY_BCS_PREF,	non_ft_pref,		src, cmds);
-			BREAK_IF_CMD(GEANY_BCS_FT,		ftp->ftdefcmds,		src, cmds);
-			BREAK_IF_CMD(GEANY_BCS_DEF,		non_ft_def,			src, cmds);
+		{
+			CommandSet cs[] = {
+				{GEANY_BCS_PROJ,	non_ft_proj},
+				{GEANY_BCS_PREF,	non_ft_pref},
+				{GEANY_BCS_FT,		ftp->ftdefcmds},
+				{GEANY_BCS_DEF,		non_ft_def},
+			};
+			memcpy(overloads, cs, sizeof(cs));
 			break;
+		}
 		case GEANY_GBG_EXEC: /* order proj, proj ft, pref, home ft, ft, def */
-			BREAK_IF_CMD(GEANY_BCS_PROJ,	exec_proj,			src, cmds);
-			BREAK_IF_CMD(GEANY_BCS_PROJ_FT,	ftp->projexeccmds,	src, cmds);
-			BREAK_IF_CMD(GEANY_BCS_PREF,	exec_pref,			src, cmds);
-			BREAK_IF_CMD(GEANY_BCS_FT,		ftp->homeexeccmds,	src, cmds);
-			BREAK_IF_CMD(GEANY_BCS_FT,		ftp->execcmds,		src, cmds);
-			BREAK_IF_CMD(GEANY_BCS_DEF,		exec_def,			src, cmds);
+		{
+			CommandSet cs[] = {
+				{GEANY_BCS_PROJ,	exec_proj},
+				{GEANY_BCS_PROJ_FT,	ftp->projexeccmds},
+				{GEANY_BCS_PREF,	exec_pref},
+				{GEANY_BCS_FT,		ftp->homeexeccmds},
+				{GEANY_BCS_FT,		ftp->execcmds},
+				{GEANY_BCS_DEF,		exec_def},
+			};
+			memcpy(overloads, cs, sizeof(cs));
 			break;
+		}
 		default:
 			return NULL;
 	}
-	if (cmds != NULL)
+	for (guint i = 0; i < G_N_ELEMENTS(overloads); i++)
 	{
-		if (psrc)
-			*psrc = src;
-		if (printbuildcmds)
-			printf("cmd[%u,%u]=%u\n", cmdgrp, cmdindex, src);
-		return &(cmds[cmdindex]);
+		GeanyBuildCommand *cmds = overloads[i].cmds;
+		guint src = overloads[i].src;
+		
+		if (cmds != NULL && cmds[cmdindex].exists && src < below)
+		{
+			if (psrc)
+				*psrc = src;
+			if (printbuildcmds)
+				printf("cmd[%u,%u]=%u\n", cmdgrp, cmdindex, src);
+			return &(cmds[cmdindex]);
+		}
 	}
 	return NULL;
 }



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list