shithub: rgbds

Download patch

ref: 3fdf01c0f53297e4e8d2d7a19040abc594d75abf
parent: 1949a61c6fd6577e384bfaeb38d21464c9b43975
author: Rangi <remy.oukaour+rangi42@gmail.com>
date: Mon Apr 26 11:52:30 EDT 2021

Resolve some TODO comments

- `out_PushSection` should not set `currentSection` to NULL because
  PUSHS, PUSHC, and PUSHO consistently keep the current section,
  charmap, and options, even though the stack has been pushed.

- `Callback__FILE__` does not need to assert that `fileName` is not
  empty because `__FILE__`'s value is quoted, and can safely be empty.

- `YY_FATAL_ERROR` and `YYLMAX` are not needed since the lexer is
  not generated with flex.

--- a/include/asm/lexer.h
+++ b/include/asm/lexer.h
@@ -53,7 +53,7 @@
  * `path` is referenced, but not held onto..!
  */
 struct LexerState *lexer_OpenFile(char const *path);
-struct LexerState *lexer_OpenFileView(char *buf, size_t size, uint32_t lineNo);
+struct LexerState *lexer_OpenFileView(char const *path, char *buf, size_t size, uint32_t lineNo);
 void lexer_RestartRept(uint32_t lineNo);
 void lexer_DeleteState(struct LexerState *state);
 void lexer_Init(void);
--- a/include/asm/main.h
+++ b/include/asm/main.h
@@ -26,12 +26,4 @@
 extern bool failedOnMissingInclude;
 extern bool generatePhonyDeps;
 
-/* TODO: are these really needed? */
-#define YY_FATAL_ERROR fatalerror
-
-#ifdef YYLMAX
-#undef YYLMAX
-#endif
-#define YYLMAX 65536
-
 #endif /* RGBDS_MAIN_H */
--- a/include/asm/symbol.h
+++ b/include/asm/symbol.h
@@ -45,13 +45,13 @@
 		/* If sym_IsNumeric */
 		int32_t value;
 		int32_t (*numCallback)(void);
-		/* For SYM_MACRO */
+		/* For SYM_MACRO and SYM_EQUS; TODO: have separate fields */
 		struct {
 			size_t macroSize;
 			char *macro;
 		};
-		/* For SYM_EQUS, TODO: separate "base" fields from SYM_MACRO */
-		char const *(*strCallback)(void); /* For SYM_EQUS */
+		/* For SYM_EQUS */
+		char const *(*strCallback)(void);
 	};
 
 	uint32_t ID; /* ID of the symbol in the object file (-1 if none) */
--- a/src/asm/fstack.c
+++ b/src/asm/fstack.c
@@ -417,7 +417,7 @@
 	memcpy(dest, macro->name, macroNameLen + 1);
 
 	newContext((struct FileStackNode *)fileInfo);
-	contextStack->lexerState = lexer_OpenFileView(macro->macro, macro->macroSize,
+	contextStack->lexerState = lexer_OpenFileView("MACRO", macro->macro, macro->macroSize,
 						      macro->fileLine);
 	if (!contextStack->lexerState)
 		fatalerror("Failed to set up lexer for macro invocation\n");
@@ -451,7 +451,7 @@
 	/* Correct our line number, which currently points to the `ENDR` line */
 	contextStack->fileInfo->lineNo = reptLineNo;
 
-	contextStack->lexerState = lexer_OpenFileView(body, size, reptLineNo);
+	contextStack->lexerState = lexer_OpenFileView("REPT", body, size, reptLineNo);
 	if (!contextStack->lexerState)
 		fatalerror("Failed to set up lexer for REPT block\n");
 	lexer_SetStateAtEOL(contextStack->lexerState);
--- a/src/asm/lexer.c
+++ b/src/asm/lexer.c
@@ -304,6 +304,8 @@
 }
 
 #define LEXER_BUF_SIZE 42 /* TODO: determine a sane value for this */
+/* The buffer needs to be large enough for the maximum `peekInternal` lookahead distance */
+static_assert(LEXER_BUF_SIZE > 1, "Lexer buffer size is too small");
 /* This caps the size of buffer reads, and according to POSIX, passing more than SSIZE_MAX is UB */
 static_assert(LEXER_BUF_SIZE <= SSIZE_MAX, "Lexer buffer size is too large");
 
@@ -531,7 +533,7 @@
 	return state;
 }
 
-struct LexerState *lexer_OpenFileView(char *buf, size_t size, uint32_t lineNo)
+struct LexerState *lexer_OpenFileView(char const *path, char *buf, size_t size, uint32_t lineNo)
 {
 	dbgPrint("Opening view on buffer \"%.*s\"[...]\n", size < 16 ? (int)size : 16, buf);
 
@@ -541,8 +543,8 @@
 		error("Failed to allocate memory for lexer state: %s\n", strerror(errno));
 		return NULL;
 	}
-	// TODO: init `path`
 
+	state->path = path; /* Used to report read errors in `peekInternal` */
 	state->isFile = false;
 	state->isMmapped = true; /* It's not *really* mmap()ed, but it behaves the same */
 	state->ptr = buf;
--- a/src/asm/section.c
+++ b/src/asm/section.c
@@ -902,7 +902,6 @@
 	sect->offset = curOffset;
 	sect->next = sectionStack;
 	sectionStack = sect;
-	/* TODO: maybe set current section to NULL? */
 }
 
 void out_PopSection(void)
--- a/src/asm/symbol.c
+++ b/src/asm/symbol.c
@@ -96,8 +96,6 @@
 	char const *fileName = fstk_GetFileName();
 	size_t j = 1;
 
-	/* TODO: is there a way for a file name to be empty? */
-	assert(fileName[0]);
 	/* The assertion above ensures the loop runs at least once */
 	for (size_t i = 0; fileName[i]; i++, j++) {
 		/* Account for the extra backslash inserted below */
@@ -175,7 +173,7 @@
 	/* If the old node was referenced, ensure the new one is */
 	if (oldSrc && oldSrc->referenced && oldSrc->ID != (uint32_t)-1)
 		out_RegisterNode(sym->src);
-	/* TODO: unref the old node, and use `out_ReplaceNode` instead if deleting it */
+	/* TODO: unref the old node, and use `out_ReplaceNode` instead of deleting it */
 }
 
 /*
@@ -226,7 +224,6 @@
 		fatalerror("No memory for string equate: %s\n", strerror(errno));
 
 	sym->type = SYM_EQUS;
-	/* TODO: use other fields */
 	sym->macro = string;
 	sym->macroSize = strlen(string);
 }
--- a/src/asm/warning.c
+++ b/src/asm/warning.c
@@ -152,8 +152,7 @@
 				errx(1, "Cannot make meta warning \"%s\" into an error",
 				     flag);
 
-			uint8_t const *ptr =
-					metaWarningCommands[id - NB_WARNINGS];
+			uint8_t const *ptr = metaWarningCommands[id - NB_WARNINGS];
 
 			for (;;) {
 				if (*ptr == META_WARNING_DONE)
@@ -194,7 +193,7 @@
 	bool isNegation = !strncmp(flag, "no-", strlen("no-")) && !setError;
 	char const *rootFlag = isNegation ? flag + strlen("no-") : flag;
 	enum WarningState state = setError ? WARNING_ERROR :
-			isNegation ? WARNING_DISABLED : WARNING_ENABLED;
+				  isNegation ? WARNING_DISABLED : WARNING_ENABLED;
 
 	/* Try to match the flag against a "normal" flag */
 	for (enum WarningID id = 0; id < NB_WARNINGS; id++) {
--- a/src/link/object.c
+++ b/src/link/object.c
@@ -48,6 +48,7 @@
 	do { \
 		FILE *tmpFile = file; \
 		type tmpVal = func(tmpFile); \
+		/* TODO: maybe mark the condition as `unlikely`; how to do that portably? */ \
 		if (tmpVal == (errval)) { \
 			errx(1, __VA_ARGS__, feof(tmpFile) \
 						? "Unexpected end of file" \
@@ -86,7 +87,6 @@
 /**
  * Helper macro for reading longs from a file, and errors out if it fails to.
  * Not as a function to avoid overhead in the general case.
- * TODO: maybe mark the condition as `unlikely`; how to do that portably?
  * @param var The variable to stash the number into
  * @param file The file to read from. Its position will be advanced
  * @param ... A format string and related arguments; note that an extra string
@@ -101,7 +101,6 @@
  * Helper macro for reading bytes from a file, and errors out if it fails to.
  * Differs from `tryGetc` in that the backing function is fgetc(1).
  * Not as a function to avoid overhead in the general case.
- * TODO: maybe mark the condition as `unlikely`; how to do that portably?
  * @param var The variable to stash the number into
  * @param file The file to read from. Its position will be advanced
  * @param ... A format string and related arguments; note that an extra string
@@ -114,7 +113,6 @@
  * Helper macro for reading bytes from a file, and errors out if it fails to.
  * Differs from `tryGetc` in that the backing function is fgetc(1).
  * Not as a function to avoid overhead in the general case.
- * TODO: maybe mark the condition as `unlikely`; how to do that portably?
  * @param var The variable to stash the number into
  * @param file The file to read from. Its position will be advanced
  * @param ... A format string and related arguments; note that an extra string
@@ -163,7 +161,6 @@
 /**
  * Helper macro for reading bytes from a file, and errors out if it fails to.
  * Not as a function to avoid overhead in the general case.
- * TODO: maybe mark the condition as `unlikely`; how to do that portably?
  * @param var The variable to stash the string into
  * @param file The file to read from. Its position will be advanced
  * @param ... A format string and related arguments; note that an extra string