diff --git a/include/asm/charmap.h b/include/asm/charmap.h index e258b4f5..65076661 100644 --- a/include/asm/charmap.h +++ b/include/asm/charmap.h @@ -20,4 +20,4 @@ void charmap_Add(char *mapping, uint8_t value); size_t charmap_Convert(char const *input, uint8_t *output); size_t charmap_ConvertNext(char const **input, uint8_t **output); -#endif /* RGBDS_ASM_CHARMAP_H */ +#endif // RGBDS_ASM_CHARMAP_H diff --git a/include/asm/fixpoint.h b/include/asm/fixpoint.h index 88a971d6..7d8c8e6d 100644 --- a/include/asm/fixpoint.h +++ b/include/asm/fixpoint.h @@ -28,4 +28,4 @@ int32_t fix_Round(int32_t i); int32_t fix_Ceil(int32_t i); int32_t fix_Floor(int32_t i); -#endif /* RGBDS_ASM_FIXPOINT_H */ +#endif // RGBDS_ASM_FIXPOINT_H diff --git a/include/asm/format.h b/include/asm/format.h index 7a144e80..eabdedb5 100644 --- a/include/asm/format.h +++ b/include/asm/format.h @@ -60,4 +60,4 @@ void fmt_FinishCharacters(struct FormatSpec *fmt); void fmt_PrintString(char *buf, size_t bufLen, struct FormatSpec const *fmt, char const *value); void fmt_PrintNumber(char *buf, size_t bufLen, struct FormatSpec const *fmt, uint32_t value); -#endif /* RGBDS_FORMAT_SPEC_H */ +#endif // RGBDS_FORMAT_SPEC_H diff --git a/include/asm/fstack.h b/include/asm/fstack.h index 97a474e1..5a3120ad 100644 --- a/include/asm/fstack.h +++ b/include/asm/fstack.h @@ -6,9 +6,7 @@ * SPDX-License-Identifier: MIT */ -/* - * Contains some assembler-wide defines and externs - */ +// Contains some assembler-wide defines and externs #ifndef RGBDS_ASM_FSTACK_H #define RGBDS_ASM_FSTACK_H @@ -21,13 +19,13 @@ struct FileStackNode { - struct FileStackNode *parent; /* Pointer to parent node, for error reporting */ - /* Line at which the parent context was exited; meaningless for the root level */ + struct FileStackNode *parent; // Pointer to parent node, for error reporting + // Line at which the parent context was exited; meaningless for the root level uint32_t lineNo; - struct FileStackNode *next; /* Next node in the output linked list */ - bool referenced; /* If referenced, don't free! */ - uint32_t ID; /* Set only if referenced: ID within the object file, -1 if not output yet */ + struct FileStackNode *next; // Next node in the output linked list + bool referenced; // If referenced, don't free! + uint32_t ID; // Set only if referenced: ID within the object file, -1 if not output yet enum { NODE_REPT, @@ -36,16 +34,16 @@ struct FileStackNode { } type; }; -struct FileStackReptNode { /* NODE_REPT */ +struct FileStackReptNode { // NODE_REPT struct FileStackNode node; uint32_t reptDepth; - /* WARNING: if changing this type, change overflow check in `fstk_Init` */ - uint32_t iters[]; /* REPT iteration counts since last named node, in reverse depth order */ + // WARNING: if changing this type, change overflow check in `fstk_Init` + uint32_t iters[]; // REPT iteration counts since last named node, in reverse depth order }; -struct FileStackNamedNode { /* NODE_FILE, NODE_MACRO */ +struct FileStackNamedNode { // NODE_FILE, NODE_MACRO struct FileStackNode node; - char name[]; /* File name for files, file::macro name for macros */ + char name[]; // File name for files, file::macro name for macros }; #define DEFAULT_MAX_DEPTH 64 @@ -56,11 +54,11 @@ struct MacroArgs; void fstk_Dump(struct FileStackNode const *node, uint32_t lineNo); void fstk_DumpCurrent(void); struct FileStackNode *fstk_GetFileStack(void); -/* The lifetime of the returned chars is until reaching the end of that file */ +// The lifetime of the returned chars is until reaching the end of that file char const *fstk_GetFileName(void); void fstk_AddIncludePath(char const *s); -/** +/* * @param path The user-provided file name * @param fullPath The address of a pointer, which will be made to point at the full path * The pointer's value must be a valid argument to `realloc`, including NULL @@ -81,4 +79,4 @@ bool fstk_Break(void); void fstk_NewRecursionDepth(size_t newDepth); void fstk_Init(char const *mainPath, size_t maxDepth); -#endif /* RGBDS_ASM_FSTACK_H */ +#endif // RGBDS_ASM_FSTACK_H diff --git a/include/asm/lexer.h b/include/asm/lexer.h index ce2544e7..a88b66bd 100644 --- a/include/asm/lexer.h +++ b/include/asm/lexer.h @@ -11,7 +11,7 @@ #include -#define MAXSTRLEN 255 +#define MAXSTRLEN 255 struct LexerState; extern struct LexerState *lexerState; @@ -49,9 +49,7 @@ static inline void lexer_SetGfxDigits(char const digits[4]) gfxDigits[3] = digits[3]; } -/* - * `path` is referenced, but not held onto..! - */ +// `path` is referenced, but not held onto..! struct LexerState *lexer_OpenFile(char const *path); struct LexerState *lexer_OpenFileView(char const *path, char *buf, size_t size, uint32_t lineNo); void lexer_RestartRept(uint32_t lineNo); @@ -99,4 +97,4 @@ struct DsArgList { struct Expression *args; }; -#endif /* RGBDS_ASM_LEXER_H */ +#endif // RGBDS_ASM_LEXER_H diff --git a/include/asm/macro.h b/include/asm/macro.h index b0c8b6a3..80221179 100644 --- a/include/asm/macro.h +++ b/include/asm/macro.h @@ -34,4 +34,4 @@ uint32_t macro_UseNewUniqueID(void); void macro_ShiftCurrentArgs(int32_t count); uint32_t macro_NbArgs(void); -#endif +#endif // RGBDS_MACRO_H diff --git a/include/asm/main.h b/include/asm/main.h index c79942e1..36532527 100644 --- a/include/asm/main.h +++ b/include/asm/main.h @@ -20,7 +20,7 @@ extern bool warnOnHaltNop; extern bool optimizeLoads; extern bool warnOnLdOpt; extern bool verbose; -extern bool warnings; /* True to enable warnings, false to disable them. */ +extern bool warnings; // True to enable warnings, false to disable them. extern FILE *dependfile; extern char *targetFileName; @@ -28,4 +28,4 @@ extern bool generatedMissingIncludes; extern bool failedOnMissingInclude; extern bool generatePhonyDeps; -#endif /* RGBDS_MAIN_H */ +#endif // RGBDS_MAIN_H diff --git a/include/asm/opt.h b/include/asm/opt.h index 23a22af8..5cbe6874 100644 --- a/include/asm/opt.h +++ b/include/asm/opt.h @@ -22,4 +22,4 @@ void opt_Parse(char const *option); void opt_Push(void); void opt_Pop(void); -#endif +#endif // RGBDS_OPT_H diff --git a/include/asm/output.h b/include/asm/output.h index 007e7ab0..579e9a45 100644 --- a/include/asm/output.h +++ b/include/asm/output.h @@ -27,4 +27,4 @@ bool out_CreateAssert(enum AssertionType type, struct Expression const *expr, char const *message, uint32_t ofs); void out_WriteObject(void); -#endif /* RGBDS_ASM_OUTPUT_H */ +#endif // RGBDS_ASM_OUTPUT_H diff --git a/include/asm/rpn.h b/include/asm/rpn.h index f15ffd99..4ca3cdd9 100644 --- a/include/asm/rpn.h +++ b/include/asm/rpn.h @@ -27,17 +27,13 @@ struct Expression { uint32_t rpnPatchSize; // Size the expression will take in the object file }; -/* - * Determines if an expression is known at assembly time - */ +// Determines if an expression is known at assembly time static inline bool rpn_isKnown(struct Expression const *expr) { return expr->isKnown; } -/* - * Determines if an expression is a symbol suitable for const diffing - */ +// Determines if an expression is a symbol suitable for const diffing static inline bool rpn_isSymbol(const struct Expression *expr) { return expr->isSymbol; @@ -67,4 +63,4 @@ void rpn_CheckRST(struct Expression *expr, const struct Expression *src); void rpn_CheckNBit(struct Expression const *expr, uint8_t n); int32_t rpn_GetConstVal(struct Expression const *expr); -#endif /* RGBDS_ASM_RPN_H */ +#endif // RGBDS_ASM_RPN_H diff --git a/include/asm/section.h b/include/asm/section.h index 8d5020cd..d92aca67 100644 --- a/include/asm/section.h +++ b/include/asm/section.h @@ -23,8 +23,8 @@ struct Section { char *name; enum SectionType type; enum SectionModifier modifier; - struct FileStackNode *src; /* Where the section was defined */ - uint32_t fileLine; /* Line where the section was defined */ + struct FileStackNode *src; // Where the section was defined + uint32_t fileLine; // Line where the section was defined uint32_t size; uint32_t org; uint32_t bank; @@ -79,4 +79,4 @@ void sect_PopSection(void); bool sect_IsSizeKnown(struct Section const NONNULL(name)); -#endif +#endif // RGBDS_SECTION_H diff --git a/include/asm/symbol.h b/include/asm/symbol.h index 0f5cf949..a440e92a 100644 --- a/include/asm/symbol.h +++ b/include/asm/symbol.h @@ -32,28 +32,28 @@ enum SymbolType { struct Symbol { char name[MAXSYMLEN + 1]; enum SymbolType type; - bool isExported; /* Whether the symbol is to be exported */ - bool isBuiltin; /* Whether the symbol is a built-in */ + bool isExported; // Whether the symbol is to be exported + bool isBuiltin; // Whether the symbol is a built-in struct Section *section; - struct FileStackNode *src; /* Where the symbol was defined */ - uint32_t fileLine; /* Line where the symbol was defined */ + struct FileStackNode *src; // Where the symbol was defined + uint32_t fileLine; // Line where the symbol was defined bool hasCallback; union { - /* If sym_IsNumeric */ + // If sym_IsNumeric int32_t value; int32_t (*numCallback)(void); - /* For SYM_MACRO and SYM_EQUS; TODO: have separate fields */ + // For SYM_MACRO and SYM_EQUS; TODO: have separate fields struct { size_t macroSize; char *macro; }; - /* For SYM_EQUS */ + // For SYM_EQUS char const *(*strCallback)(void); }; - uint32_t ID; /* ID of the symbol in the object file (-1 if none) */ - struct Symbol *next; /* Next object to output in the object file */ + uint32_t ID; // ID of the symbol in the object file (-1 if none) + struct Symbol *next; // Next object to output in the object file }; bool sym_IsPC(struct Symbol const *sym); @@ -98,9 +98,7 @@ static inline bool sym_IsExported(struct Symbol const *sym) return sym->isExported; } -/* - * Get a string equate's value - */ +// Get a string equate's value static inline char const *sym_GetStringValue(struct Symbol const *sym) { if (sym->hasCallback) @@ -123,17 +121,11 @@ struct Symbol *sym_AddVar(char const *symName, int32_t value); uint32_t sym_GetPCValue(void); uint32_t sym_GetConstantSymValue(struct Symbol const *sym); uint32_t sym_GetConstantValue(char const *symName); -/* - * Find a symbol by exact name, bypassing expansion checks - */ +// Find a symbol by exact name, bypassing expansion checks struct Symbol *sym_FindExactSymbol(char const *symName); -/* - * Find a symbol by exact name; may not be scoped, produces an error if it is - */ +// Find a symbol by exact name; may not be scoped, produces an error if it is struct Symbol *sym_FindUnscopedSymbol(char const *symName); -/* - * Find a symbol, possibly scoped, by name - */ +// Find a symbol, possibly scoped, by name struct Symbol *sym_FindScopedSymbol(char const *symName); struct Symbol const *sym_GetPC(void); struct Symbol *sym_AddMacro(char const *symName, int32_t defLineNo, char *body, size_t size); @@ -143,8 +135,8 @@ struct Symbol *sym_RedefString(char const *symName, char const *value); void sym_Purge(char const *symName); void sym_Init(time_t now); -/* Functions to save and restore the current symbol scope. */ +// Functions to save and restore the current symbol scope. char const *sym_GetCurrentSymbolScope(void); void sym_SetCurrentSymbolScope(char const *newScope); -#endif /* RGBDS_SYMBOL_H */ +#endif // RGBDS_SYMBOL_H diff --git a/include/asm/util.h b/include/asm/util.h index c9437222..d844cc95 100644 --- a/include/asm/util.h +++ b/include/asm/util.h @@ -18,4 +18,4 @@ char const *printChar(int c); */ size_t readUTF8Char(uint8_t *dest, char const *src); -#endif /* RGBDS_UTIL_H */ +#endif // RGBDS_UTIL_H diff --git a/include/asm/warning.h b/include/asm/warning.h index 1cadc59d..d6abf33f 100644 --- a/include/asm/warning.h +++ b/include/asm/warning.h @@ -91,4 +91,4 @@ _Noreturn void fatalerror(char const *fmt, ...) format_(printf, 1, 2); */ void error(char const *fmt, ...) format_(printf, 1, 2); -#endif +#endif // WARNING_H diff --git a/include/defaultinitalloc.hpp b/include/defaultinitalloc.hpp index 43cb2146..5335831d 100644 --- a/include/defaultinitalloc.hpp +++ b/include/defaultinitalloc.hpp @@ -1,4 +1,4 @@ -/** +/* * Allocator adaptor that interposes construct() calls to convert value-initialization * (which is what you get with e.g. `vector::resize`) into default-initialization (which does not * zero out non-class types). @@ -36,4 +36,4 @@ public: template using DefaultInitVec = std::vector>; -#endif +#endif // DEFAULT_INIT_ALLOC_H diff --git a/include/error.h b/include/error.h index d3bc43c4..f7ad06a4 100644 --- a/include/error.h +++ b/include/error.h @@ -26,4 +26,4 @@ _Noreturn void errx(char const NONNULL(fmt), ...) format_(printf, 1, 2); } #endif -#endif /* RGBDS_ERROR_H */ +#endif // RGBDS_ERROR_H diff --git a/include/extern/utf8decoder.h b/include/extern/utf8decoder.h index e80165d6..36e83a13 100644 --- a/include/extern/utf8decoder.h +++ b/include/extern/utf8decoder.h @@ -11,4 +11,4 @@ uint32_t decode(uint32_t *state, uint32_t *codep, uint8_t byte); -#endif /* EXTERN_UTF8DECODER_H */ +#endif // EXTERN_UTF8DECODER_H diff --git a/include/gfx/main.hpp b/include/gfx/main.hpp index 73063c1c..7a5b0213 100644 --- a/include/gfx/main.hpp +++ b/include/gfx/main.hpp @@ -71,19 +71,19 @@ struct Options { extern Options options; -/** +/* * Prints the error count, and exits with failure */ [[noreturn]] void giveUp(); -/** +/* * Prints a warning, and does not change the error count */ void warning(char const *fmt, ...); -/** +/* * Prints an error, and increments the error count */ void error(char const *fmt, ...); -/** +/* * Prints a fatal error, increments the error count, and gives up */ [[noreturn]] void fatal(char const *fmt, ...); @@ -120,4 +120,4 @@ static constexpr auto flipTable(std::integer_sequence) { // Flipping tends to happen fairly often, so take a bite out of dcache to speed it up static constexpr auto flipTable = detail::flipTable(std::make_integer_sequence()); -#endif /* RGBDS_GFX_MAIN_HPP */ +#endif // RGBDS_GFX_MAIN_HPP diff --git a/include/gfx/pal_packing.hpp b/include/gfx/pal_packing.hpp index d208866e..a3901a72 100644 --- a/include/gfx/pal_packing.hpp +++ b/include/gfx/pal_packing.hpp @@ -21,7 +21,7 @@ class ProtoPalette; namespace packing { -/** +/* * Returns which palette each proto-palette maps to, and how many palettes are necessary */ std::tuple, size_t> @@ -29,4 +29,4 @@ std::tuple, size_t> } -#endif /* RGBDS_GFX_PAL_PACKING_HPP */ +#endif // RGBDS_GFX_PAL_PACKING_HPP diff --git a/include/gfx/pal_sorting.hpp b/include/gfx/pal_sorting.hpp index 70f5b714..0393607f 100644 --- a/include/gfx/pal_sorting.hpp +++ b/include/gfx/pal_sorting.hpp @@ -29,4 +29,4 @@ void rgb(std::vector &palettes); } -#endif /* RGBDS_GFX_PAL_SORTING_HPP */ +#endif // RGBDS_GFX_PAL_SORTING_HPP diff --git a/include/gfx/pal_spec.hpp b/include/gfx/pal_spec.hpp index 201eb080..55b815a4 100644 --- a/include/gfx/pal_spec.hpp +++ b/include/gfx/pal_spec.hpp @@ -12,4 +12,4 @@ void parseInlinePalSpec(char const * const arg); void parseExternalPalSpec(char const *arg); -#endif /* RGBDS_GFX_PAL_SPEC_HPP */ +#endif // RGBDS_GFX_PAL_SPEC_HPP diff --git a/include/gfx/process.hpp b/include/gfx/process.hpp index 8c2dfb98..1ac5931a 100644 --- a/include/gfx/process.hpp +++ b/include/gfx/process.hpp @@ -11,4 +11,4 @@ void process(); -#endif /* RGBDS_GFX_CONVERT_HPP */ +#endif // RGBDS_GFX_CONVERT_HPP diff --git a/include/gfx/proto_palette.hpp b/include/gfx/proto_palette.hpp index 101a5ac5..b2cc4433 100644 --- a/include/gfx/proto_palette.hpp +++ b/include/gfx/proto_palette.hpp @@ -21,7 +21,7 @@ class ProtoPalette { std::array _colorIndices{UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX}; public: - /** + /* * Adds the specified color to the set * Returns false if the set is full */ @@ -41,4 +41,4 @@ public: decltype(_colorIndices)::const_iterator end() const; }; -#endif /* RGBDS_GFX_PROTO_PALETTE_HPP */ +#endif // RGBDS_GFX_PROTO_PALETTE_HPP diff --git a/include/gfx/reverse.hpp b/include/gfx/reverse.hpp index aa1aef5b..52e5ec3f 100644 --- a/include/gfx/reverse.hpp +++ b/include/gfx/reverse.hpp @@ -11,4 +11,4 @@ void reverse(); -#endif /* RGBDS_GFX_REVERSE_HPP */ +#endif // RGBDS_GFX_REVERSE_HPP diff --git a/include/gfx/rgba.hpp b/include/gfx/rgba.hpp index 427a1232..c04e8205 100644 --- a/include/gfx/rgba.hpp +++ b/include/gfx/rgba.hpp @@ -20,7 +20,7 @@ struct Rgba { constexpr Rgba(uint8_t r, uint8_t g, uint8_t b, uint8_t a) : red(r), green(g), blue(b), alpha(a) {} - /** + /* * Constructs the color from a "packed" RGBA representation (0xRRGGBBAA) */ explicit constexpr Rgba(uint32_t rgba = 0) @@ -35,7 +35,7 @@ struct Rgba { (uint8_t)(cgbColor & 0x8000 ? 0x00 : 0xFF)}; } - /** + /* * Returns this RGBA as a 32-bit number that can be printed in hex (`%08x`) to yield its CSS * representation */ @@ -45,7 +45,7 @@ struct Rgba { } friend bool operator!=(Rgba const &lhs, Rgba const &rhs) { return lhs.toCSS() != rhs.toCSS(); } - /** + /* * CGB colors are RGB555, so we use bit 15 to signify that the color is transparent instead * Since the rest of the bits don't matter then, we return 0x8000 exactly. */ @@ -55,7 +55,7 @@ struct Rgba { bool isTransparent() const { return alpha < transparency_threshold; } static constexpr uint8_t opacity_threshold = 0xF0; bool isOpaque() const { return alpha >= opacity_threshold; } - /** + /* * Computes the equivalent CGB color, respects the color curve depending on options */ uint16_t cgbColor() const; @@ -64,4 +64,4 @@ struct Rgba { uint8_t grayIndex() const; }; -#endif /* RGBDS_GFX_RGBA_HPP */ +#endif // RGBDS_GFX_RGBA_HPP diff --git a/include/hashmap.h b/include/hashmap.h index d751e360..252b732d 100644 --- a/include/hashmap.h +++ b/include/hashmap.h @@ -6,7 +6,7 @@ * SPDX-License-Identifier: MIT */ -/* Generic hashmap implementation (C++ templates are calling...) */ +// Generic hashmap implementation (C++ templates are calling...) #ifndef RGBDS_LINK_HASHMAP_H #define RGBDS_LINK_HASHMAP_H @@ -18,10 +18,10 @@ static_assert(HALF_HASH_NB_BITS * 2 == HASH_NB_BITS, ""); #define HASHMAP_NB_BUCKETS (1 << HALF_HASH_NB_BITS) -/* HashMapEntry is internal, please do not attempt to use it */ +// HashMapEntry is internal, please do not attempt to use it typedef struct HashMapEntry *HashMap[HASHMAP_NB_BUCKETS]; -/** +/* * Adds an element to a hashmap. * @warning Adding a new element with an already-present key will not cause an * error, this must be handled externally. @@ -33,7 +33,7 @@ typedef struct HashMapEntry *HashMap[HASHMAP_NB_BUCKETS]; */ void **hash_AddElement(HashMap map, char const *key, void *element); -/** +/* * Removes an element from a hashmap. * @param map The HashMap to remove the element from * @param key The key to search the element with @@ -41,7 +41,7 @@ void **hash_AddElement(HashMap map, char const *key, void *element); */ bool hash_RemoveElement(HashMap map, char const *key); -/** +/* * Finds an element in a hashmap, and returns a pointer to its value field. * @param map The map to consider the elements of * @param key The key to search an element for @@ -49,7 +49,7 @@ bool hash_RemoveElement(HashMap map, char const *key); */ void **hash_GetNode(HashMap const map, char const *key); -/** +/* * Finds an element in a hashmap. * @param map The map to consider the elements of * @param key The key to search an element for @@ -58,7 +58,7 @@ void **hash_GetNode(HashMap const map, char const *key); */ void *hash_GetElement(HashMap const map, char const *key); -/** +/* * Executes a function on each element in a hashmap. * @param map The map to consider the elements of * @param func The function to run. The first argument will be the element, @@ -67,11 +67,11 @@ void *hash_GetElement(HashMap const map, char const *key); */ void hash_ForEach(HashMap const map, void (*func)(void *, void *), void *arg); -/** +/* * Cleanly empties a hashmap from its contents. * This does not `free` the data structure itself! * @param map The map to empty */ void hash_EmptyMap(HashMap map); -#endif /* RGBDS_LINK_HASHMAP_H */ +#endif // RGBDS_LINK_HASHMAP_H diff --git a/include/helpers.h b/include/helpers.h index a9896610..63002cf3 100644 --- a/include/helpers.h +++ b/include/helpers.h @@ -93,4 +93,4 @@ // (Having two instances of `arr` is OK because the contents of `sizeof` are not evaluated.) #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof *(arr)) -#endif /* HELPERS_H */ +#endif // HELPERS_H diff --git a/include/itertools.hpp b/include/itertools.hpp index 892bb89d..9c3712fc 100644 --- a/include/itertools.hpp +++ b/include/itertools.hpp @@ -79,12 +79,10 @@ using Holder = std::conditional_t, T, std::remove_cv_t>>; } -/** - * Does the same number of iterations as the first container's iterator! - */ +// Does the same number of iterations as the first container's iterator! template static constexpr auto zip(Containers &&...cs) { return detail::ZipContainer...>(std::forward(cs)...); } -#endif /* RGBDS_ITERTOOLS_HPP */ +#endif // RGBDS_ITERTOOLS_HPP diff --git a/include/link/assign.h b/include/link/assign.h index bc553620..e7d0ee0a 100644 --- a/include/link/assign.h +++ b/include/link/assign.h @@ -6,7 +6,7 @@ * SPDX-License-Identifier: MIT */ -/* Assigning all sections a place */ +// Assigning all sections a place #ifndef RGBDS_LINK_ASSIGN_H #define RGBDS_LINK_ASSIGN_H @@ -14,14 +14,10 @@ extern uint64_t nbSectionsToAssign; -/** - * Assigns all sections a slice of the address space - */ +// Assigns all sections a slice of the address space void assign_AssignSections(void); -/** - * `free`s all assignment memory that was allocated. - */ +// `free`s all assignment memory that was allocated void assign_Cleanup(void); -#endif /* RGBDS_LINK_ASSIGN_H */ +#endif // RGBDS_LINK_ASSIGN_H diff --git a/include/link/main.h b/include/link/main.h index 387f3078..c7ca7dce 100644 --- a/include/link/main.h +++ b/include/link/main.h @@ -6,7 +6,7 @@ * SPDX-License-Identifier: MIT */ -/* Declarations that all modules use, as well as `main` and related */ +// Declarations that all modules use, as well as `main` and related #ifndef RGBDS_LINK_MAIN_H #define RGBDS_LINK_MAIN_H @@ -16,7 +16,7 @@ #include "helpers.h" -/* Variables related to CLI options */ +// Variables related to CLI options extern bool isDmgMode; extern char *linkerScriptName; extern char const *mapFileName; @@ -35,7 +35,7 @@ extern bool disablePadding; struct FileStackNode { struct FileStackNode *parent; - /* Line at which the parent context was exited; meaningless for the root level */ + // Line at which the parent context was exited; meaningless for the root level uint32_t lineNo; enum { @@ -44,21 +44,21 @@ struct FileStackNode { NODE_MACRO, } type; union { - char *name; /* NODE_FILE, NODE_MACRO */ - struct { /* NODE_REPT */ + char *name; // NODE_FILE, NODE_MACRO + struct { // NODE_REPT uint32_t reptDepth; uint32_t *iters; }; }; }; -/* Helper macro for printing verbose-mode messages */ +// Helper macro for printing verbose-mode messages #define verbosePrint(...) do { \ if (beVerbose) \ fprintf(stderr, __VA_ARGS__); \ } while (0) -/** +/* * Dump a file stack to stderr * @param node The leaf node to dump the context of */ @@ -73,7 +73,7 @@ void error(struct FileStackNode const *where, uint32_t lineNo, _Noreturn void fatal(struct FileStackNode const *where, uint32_t lineNo, char const *fmt, ...) format_(printf, 3, 4); -/** +/* * Opens a file if specified, and aborts on error. * @param fileName The name of the file to open; if NULL, no file will be opened * @param mode The mode to open the file with @@ -87,4 +87,4 @@ FILE *openFile(char const *fileName, char const *mode); fclose(tmp); \ } while (0) -#endif /* RGBDS_LINK_MAIN_H */ +#endif // RGBDS_LINK_MAIN_H diff --git a/include/link/object.h b/include/link/object.h index b43d728b..6662fef2 100644 --- a/include/link/object.h +++ b/include/link/object.h @@ -6,37 +6,37 @@ * SPDX-License-Identifier: MIT */ -/* Declarations related to processing of object (.o) files */ +// Declarations related to processing of object (.o) files #ifndef RGBDS_LINK_OBJECT_H #define RGBDS_LINK_OBJECT_H -/** +/* * Read an object (.o) file, and add its info to the data structures. * @param fileName A path to the object file to be read * @param i The ID of the file */ void obj_ReadFile(char const *fileName, unsigned int i); -/** +/* * Perform validation on the object files' contents */ void obj_DoSanityChecks(void); -/** +/* * Evaluate all assertions */ void obj_CheckAssertions(void); -/** +/* * Sets up object file reading * @param nbFiles The number of object files that will be read */ void obj_Setup(unsigned int nbFiles); -/** +/* * `free`s all object memory that was allocated. */ void obj_Cleanup(void); -#endif /* RGBDS_LINK_OBJECT_H */ +#endif // RGBDS_LINK_OBJECT_H diff --git a/include/link/output.h b/include/link/output.h index 6b1719f2..d68f254c 100644 --- a/include/link/output.h +++ b/include/link/output.h @@ -6,7 +6,7 @@ * SPDX-License-Identifier: MIT */ -/* Outputting the result of linking */ +// Outputting the result of linking #ifndef RGBDS_LINK_OUTPUT_H #define RGBDS_LINK_OUTPUT_H @@ -14,22 +14,22 @@ #include "link/section.h" -/** +/* * Registers a section for output. * @param section The section to add */ void out_AddSection(struct Section const *section); -/** +/* * Finds an assigned section overlapping another one. * @param section The section that is being overlapped * @return A section overlapping it */ struct Section const *out_OverlappingSection(struct Section const *section); -/** +/* * Writes all output (bin, sym, map) files. */ void out_WriteFiles(void); -#endif /* RGBDS_LINK_OUTPUT_H */ +#endif // RGBDS_LINK_OUTPUT_H diff --git a/include/link/patch.h b/include/link/patch.h index 4ddd03fb..37c1f8f9 100644 --- a/include/link/patch.h +++ b/include/link/patch.h @@ -6,7 +6,7 @@ * SPDX-License-Identifier: MIT */ -/* Applying patches to SECTIONs */ +// Applying patches to SECTIONs #ifndef RGBDS_LINK_PATCH_H #define RGBDS_LINK_PATCH_H @@ -27,15 +27,15 @@ struct Assertion { struct Assertion *next; }; -/** +/* * Checks all assertions * @return true if assertion failed */ void patch_CheckAssertions(struct Assertion *assertion); -/** +/* * Applies all SECTIONs' patches to them */ void patch_ApplyPatches(void); -#endif /* RGBDS_LINK_PATCH_H */ +#endif // RGBDS_LINK_PATCH_H diff --git a/include/link/script.h b/include/link/script.h index a635e8b6..a736bcb0 100644 --- a/include/link/script.h +++ b/include/link/script.h @@ -6,7 +6,7 @@ * SPDX-License-Identifier: MIT */ -/* Parsing a linker script */ +// Parsing a linker script #ifndef RGBDS_LINK_SCRIPT_H #define RGBDS_LINK_SCRIPT_H @@ -24,15 +24,15 @@ struct SectionPlacement { extern uint64_t script_lineNo; -/** +/* * Parses the linker script to return the next section constraint * @return A pointer to a struct, or NULL on EOF. The pointer shouldn't be freed */ struct SectionPlacement *script_NextSection(void); -/** +/* * `free`s all assignment memory that was allocated. */ void script_Cleanup(void); -#endif /* RGBDS_LINK_SCRIPT_H */ +#endif // RGBDS_LINK_SCRIPT_H diff --git a/include/link/sdas_obj.h b/include/link/sdas_obj.h index fee29e07..a7e3bbaa 100644 --- a/include/link/sdas_obj.h +++ b/include/link/sdas_obj.h @@ -6,7 +6,7 @@ * SPDX-License-Identifier: MIT */ -/* Assigning all sections a place */ +// Assigning all sections a place #ifndef RGBDS_LINK_SDAS_OBJ_H #define RGBDS_LINK_SDAS_OBJ_H @@ -16,4 +16,4 @@ struct FileStackNode; void sdobj_ReadFile(struct FileStackNode const *fileName, FILE *file); -#endif /* RGBDS_LINK_SDAS_OBJ_H */ +#endif // RGBDS_LINK_SDAS_OBJ_H diff --git a/include/link/section.h b/include/link/section.h index beb9f034..5a94de6d 100644 --- a/include/link/section.h +++ b/include/link/section.h @@ -6,11 +6,11 @@ * SPDX-License-Identifier: MIT */ -/* Declarations manipulating symbols */ +// Declarations manipulating symbols #ifndef RGBDS_LINK_SECTION_H #define RGBDS_LINK_SECTION_H -/* GUIDELINE: external code MUST NOT BE AWARE of the data structure used!! */ +// GUIDELINE: external code MUST NOT BE AWARE of the data structure used!! #include #include @@ -41,7 +41,7 @@ struct Patch { }; struct Section { - /* Info contained in the object files */ + // Info contained in the object files char *name; uint16_t size; uint16_t offset; @@ -56,14 +56,14 @@ struct Section { bool isAlignFixed; uint16_t alignMask; uint16_t alignOfs; - uint8_t *data; /* Array of size `size`*/ + uint8_t *data; // Array of size `size` uint32_t nbPatches; struct Patch *patches; - /* Extra info computed during linking */ + // Extra info computed during linking struct Symbol **fileSymbols; uint32_t nbSymbols; struct Symbol **symbols; - struct Section *nextu; /* The next "component" of this unionized sect */ + struct Section *nextu; // The next "component" of this unionized sect }; /* @@ -76,27 +76,27 @@ struct Section { */ void sect_ForEach(void (*callback)(struct Section *, void *), void *arg); -/** +/* * Registers a section to be processed. * @param section The section to register. */ void sect_AddSection(struct Section *section); -/** +/* * Finds a section by its name. * @param name The name of the section to look for * @return A pointer to the section, or NULL if it wasn't found */ struct Section *sect_GetSection(char const *name); -/** +/* * `free`s all section memory that was allocated. */ void sect_CleanupSections(void); -/** +/* * Checks if all sections meet reasonable criteria, such as max size */ void sect_DoSanityChecks(void); -#endif /* RGBDS_LINK_SECTION_H */ +#endif // RGBDS_LINK_SECTION_H diff --git a/include/link/symbol.h b/include/link/symbol.h index 76305dfa..11c2d541 100644 --- a/include/link/symbol.h +++ b/include/link/symbol.h @@ -6,11 +6,11 @@ * SPDX-License-Identifier: MIT */ -/* Declarations manipulating symbols */ +// Declarations manipulating symbols #ifndef RGBDS_LINK_SYMBOL_H #define RGBDS_LINK_SYMBOL_H -/* GUIDELINE: external code MUST NOT BE AWARE of the data structure used!! */ +// GUIDELINE: external code MUST NOT BE AWARE of the data structure used!! #include @@ -19,7 +19,7 @@ struct FileStackNode; struct Symbol { - /* Info contained in the object files */ + // Info contained in the object files char *name; enum ExportLevel type; char const *objFileName; @@ -31,7 +31,7 @@ struct Symbol { int32_t offset; int32_t value; }; - /* Extra info computed during linking */ + // Extra info computed during linking struct Section *section; }; @@ -47,16 +47,16 @@ void sym_ForEach(void (*callback)(struct Symbol *, void *), void *arg); void sym_AddSymbol(struct Symbol *symbol); -/** +/* * Finds a symbol in all the defined symbols. * @param name The name of the symbol to look for * @return A pointer to the symbol, or NULL if not found. */ struct Symbol *sym_GetSymbol(char const *name); -/** +/* * `free`s all symbol memory that was allocated. */ void sym_CleanupSymbols(void); -#endif /* RGBDS_LINK_SYMBOL_H */ +#endif // RGBDS_LINK_SYMBOL_H diff --git a/include/linkdefs.h b/include/linkdefs.h index 8cf3c8b9..3926c990 100644 --- a/include/linkdefs.h +++ b/include/linkdefs.h @@ -88,7 +88,7 @@ extern struct SectionTypeInfo { uint32_t lastBank; } sectionTypeInfo[SECTTYPE_INVALID]; -/** +/* * Tells whether a section has data in its object file definition, * depending on type. * @param type The section's type @@ -100,7 +100,7 @@ static inline bool sect_HasData(enum SectionType type) return type == SECTTYPE_ROM0 || type == SECTTYPE_ROMX; } -/** +/* * Computes a memory region's end address (last byte), eg. 0x7FFF * @return The address of the last byte in that memory region */ @@ -109,7 +109,7 @@ static inline uint16_t endaddr(enum SectionType type) return sectionTypeInfo[type].startAddr + sectionTypeInfo[type].size - 1; } -/** +/* * Computes a memory region's number of banks * @return The number of banks, 1 for regions without banking */ @@ -141,4 +141,4 @@ enum PatchType { PATCHTYPE_INVALID }; -#endif /* RGBDS_LINKDEFS_H */ +#endif // RGBDS_LINKDEFS_H diff --git a/include/opmath.h b/include/opmath.h index b1804f0b..4a4b1a04 100644 --- a/include/opmath.h +++ b/include/opmath.h @@ -18,4 +18,4 @@ int32_t op_shift_left(int32_t value, int32_t amount); int32_t op_shift_right(int32_t value, int32_t amount); int32_t op_shift_right_unsigned(int32_t value, int32_t amount); -#endif /* RGBDS_OP_MATH_H */ +#endif // RGBDS_OP_MATH_H diff --git a/include/platform.h b/include/platform.h index bb2fcc65..633b3141 100644 --- a/include/platform.h +++ b/include/platform.h @@ -6,7 +6,7 @@ * SPDX-License-Identifier: MIT */ -/* platform-specific hacks */ +// platform-specific hacks #ifndef RGBDS_PLATFORM_H #define RGBDS_PLATFORM_H @@ -20,20 +20,20 @@ # include #endif -/* MSVC has deprecated strdup in favor of _strdup */ +// MSVC has deprecated strdup in favor of _strdup #ifdef _MSC_VER # define strdup _strdup #endif -/* MSVC prefixes the names of S_* macros with underscores, - and doesn't define any S_IS* macros. Define them ourselves */ +// MSVC prefixes the names of S_* macros with underscores, +// and doesn't define any S_IS* macros; define them ourselves #ifdef _MSC_VER # define S_IFMT _S_IFMT # define S_IFDIR _S_IFDIR # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) #endif -/* MSVC doesn't use POSIX types or defines for `read` */ +// MSVC doesn't use POSIX types or defines for `read` #ifdef _MSC_VER # include # define STDIN_FILENO 0 @@ -46,7 +46,7 @@ # include #endif -/* MSVC doesn't support `[static N]` for array arguments from C99 or C11 */ +// MSVC doesn't support `[static N]` for array arguments from C99 or C11 #ifdef _MSC_VER # define MIN_NB_ELMS(N) # define ARR_QUALS(...) @@ -75,4 +75,4 @@ # define setmode(fd, mode) ((void)0) #endif -#endif /* RGBDS_PLATFORM_H */ +#endif // RGBDS_PLATFORM_H diff --git a/include/version.h b/include/version.h index 99460c74..ae14ea8e 100644 --- a/include/version.h +++ b/include/version.h @@ -24,4 +24,4 @@ char const *get_package_version_string(void); } #endif -#endif /* EXTERN_VERSION_H */ +#endif // EXTERN_VERSION_H diff --git a/src/asm/charmap.c b/src/asm/charmap.c index c8a780d6..b84e13b5 100644 --- a/src/asm/charmap.c +++ b/src/asm/charmap.c @@ -21,33 +21,29 @@ #include "hashmap.h" -/* - * Charmaps are stored using a structure known as "trie". - * Essentially a tree, where each nodes stores a single character's worth of info: - * whether there exists a mapping that ends at the current character, - */ +// Charmaps are stored using a structure known as "trie". +// Essentially a tree, where each nodes stores a single character's worth of info: +// whether there exists a mapping that ends at the current character, struct Charnode { - bool isTerminal; /* Whether there exists a mapping that ends here */ - uint8_t value; /* If the above is true, its corresponding value */ - /* This MUST be indexes and not pointers, because pointers get invalidated by `realloc`!! */ - size_t next[255]; /* Indexes of where to go next, 0 = nowhere */ + bool isTerminal; // Whether there exists a mapping that ends here + uint8_t value; // If the above is true, its corresponding value + // This MUST be indexes and not pointers, because pointers get invalidated by `realloc`!! + size_t next[255]; // Indexes of where to go next, 0 = nowhere }; #define INITIAL_CAPACITY 32 struct Charmap { char *name; - size_t usedNodes; /* How many nodes are being used */ - size_t capacity; /* How many nodes have been allocated */ - struct Charnode nodes[]; /* first node is reserved for the root node */ + size_t usedNodes; // How many nodes are being used + size_t capacity; // How many nodes have been allocated + struct Charnode nodes[]; // first node is reserved for the root node }; static HashMap charmaps; -/* - * Store pointers to hashmap nodes, so that there is only one pointer to the memory block - * that gets reallocated. - */ +// Store pointers to hashmap nodes, so that there is only one pointer to the memory block +// that gets reallocated. static struct Charmap **currentCharmap; struct CharmapStackEntry { @@ -96,7 +92,7 @@ struct Charmap *charmap_New(char const *name, char const *baseName) return charmap; } - /* Init the new charmap's fields */ + // Init the new charmap's fields if (base) { resizeCharmap(&charmap, base->capacity); charmap->usedNodes = base->usedNodes; @@ -105,7 +101,7 @@ struct Charmap *charmap_New(char const *name, char const *baseName) } else { resizeCharmap(&charmap, INITIAL_CAPACITY); charmap->usedNodes = 1; - initNode(&charmap->nodes[0]); /* Init the root node */ + initNode(&charmap->nodes[0]); // Init the root node } charmap->name = strdup(name); @@ -169,16 +165,16 @@ void charmap_Add(char *mapping, uint8_t value) if (node->next[c]) { node = &charmap->nodes[node->next[c]]; } else { - /* Register next available node */ + // Register next available node node->next[c] = charmap->usedNodes; - /* If no more nodes are available, get new ones */ + // If no more nodes are available, get new ones if (charmap->usedNodes == charmap->capacity) { charmap->capacity *= 2; resizeCharmap(currentCharmap, charmap->capacity); charmap = *currentCharmap; } - /* Switch to and init new node */ + // Switch to and init new node node = &charmap->nodes[charmap->usedNodes++]; initNode(node); } @@ -203,12 +199,10 @@ size_t charmap_Convert(char const *input, uint8_t *output) size_t charmap_ConvertNext(char const **input, uint8_t **output) { - /* - * The goal is to match the longest mapping possible. - * For that, advance through the trie with each character read. - * If that would lead to a dead end, rewind characters until the last match, and output. - * If no match, read a UTF-8 codepoint and output that. - */ + // The goal is to match the longest mapping possible. + // For that, advance through the trie with each character read. + // If that would lead to a dead end, rewind characters until the last match, and output. + // If no match, read a UTF-8 codepoint and output that. struct Charmap const *charmap = *currentCharmap; struct Charnode const *node = &charmap->nodes[0]; struct Charnode const *match = NULL; diff --git a/src/asm/fixpoint.c b/src/asm/fixpoint.c index af4b274a..27648f34 100644 --- a/src/asm/fixpoint.c +++ b/src/asm/fixpoint.c @@ -6,9 +6,7 @@ * SPDX-License-Identifier: MIT */ -/* - * Fixed-point math routines - */ +// Fixed-point math routines #include #include @@ -30,9 +28,6 @@ #define M_PI 3.14159265358979323846 #endif -/* - * Print a fixed point value - */ void fix_Print(int32_t i) { uint32_t u = i; @@ -47,121 +42,76 @@ void fix_Print(int32_t i) ((uint32_t)(fix2double(u) * 100000 + 0.5)) % 100000); } -/* - * Calculate sine - */ int32_t fix_Sin(int32_t i) { return double2fix(sin(fdeg2rad(fix2double(i)))); } -/* - * Calculate cosine - */ int32_t fix_Cos(int32_t i) { return double2fix(cos(fdeg2rad(fix2double(i)))); } -/* - * Calculate tangent - */ int32_t fix_Tan(int32_t i) { return double2fix(tan(fdeg2rad(fix2double(i)))); } -/* - * Calculate arcsine - */ int32_t fix_ASin(int32_t i) { return double2fix(rad2fdeg(asin(fix2double(i)))); } -/* - * Calculate arccosine - */ int32_t fix_ACos(int32_t i) { return double2fix(rad2fdeg(acos(fix2double(i)))); } -/* - * Calculate arctangent - */ int32_t fix_ATan(int32_t i) { return double2fix(rad2fdeg(atan(fix2double(i)))); } -/* - * Calculate atan2 - */ int32_t fix_ATan2(int32_t i, int32_t j) { return double2fix(rad2fdeg(atan2(fix2double(i), fix2double(j)))); } -/* - * Multiplication - */ int32_t fix_Mul(int32_t i, int32_t j) { return double2fix(fix2double(i) * fix2double(j)); } -/* - * Division - */ int32_t fix_Div(int32_t i, int32_t j) { return double2fix(fix2double(i) / fix2double(j)); } -/* - * Modulo - */ int32_t fix_Mod(int32_t i, int32_t j) { return double2fix(fmod(fix2double(i), fix2double(j))); } -/* - * Power - */ int32_t fix_Pow(int32_t i, int32_t j) { return double2fix(pow(fix2double(i), fix2double(j))); } -/* - * Logarithm - */ int32_t fix_Log(int32_t i, int32_t j) { return double2fix(log(fix2double(i)) / log(fix2double(j))); } -/* - * Round - */ int32_t fix_Round(int32_t i) { return double2fix(round(fix2double(i))); } -/* - * Ceil - */ int32_t fix_Ceil(int32_t i) { return double2fix(ceil(fix2double(i))); } -/* - * Floor - */ int32_t fix_Floor(int32_t i) { return double2fix(floor(fix2double(i))); diff --git a/src/asm/format.c b/src/asm/format.c index c4c7e947..52d6a07f 100644 --- a/src/asm/format.c +++ b/src/asm/format.c @@ -46,7 +46,7 @@ void fmt_UseCharacter(struct FormatSpec *fmt, int c) return; switch (c) { - /* sign */ + // sign case ' ': case '+': if (fmt->state > FORMAT_SIGN) @@ -55,7 +55,7 @@ void fmt_UseCharacter(struct FormatSpec *fmt, int c) fmt->sign = c; break; - /* prefix */ + // prefix case '#': if (fmt->state > FORMAT_PREFIX) goto invalid; @@ -63,7 +63,7 @@ void fmt_UseCharacter(struct FormatSpec *fmt, int c) fmt->prefix = true; break; - /* align */ + // align case '-': if (fmt->state > FORMAT_ALIGN) goto invalid; @@ -71,11 +71,11 @@ void fmt_UseCharacter(struct FormatSpec *fmt, int c) fmt->alignLeft = true; break; - /* pad and width */ + // pad and width case '0': if (fmt->state < FORMAT_WIDTH) fmt->padZero = true; - /* fallthrough */ + // fallthrough case '1': case '2': case '3': @@ -104,7 +104,7 @@ void fmt_UseCharacter(struct FormatSpec *fmt, int c) fmt->hasFrac = true; break; - /* type */ + // type case 'd': case 'u': case 'X': @@ -149,7 +149,7 @@ void fmt_PrintString(char *buf, size_t bufLen, struct FormatSpec const *fmt, cha size_t len = strlen(value); size_t totalLen = fmt->width > len ? fmt->width : len; - if (totalLen > bufLen - 1) { /* bufLen includes terminator */ + if (totalLen > bufLen - 1) { // bufLen includes terminator error("Formatted string value too long\n"); totalLen = bufLen - 1; if (len > totalLen) @@ -182,7 +182,7 @@ void fmt_PrintNumber(char *buf, size_t bufLen, struct FormatSpec const *fmt, uin if (fmt->type == 's') error("Formatting number as type 's'\n"); - char sign = fmt->sign; /* 0 or ' ' or '+' */ + char sign = fmt->sign; // 0 or ' ' or '+' if (fmt->type == 'd' || fmt->type == 'f') { int32_t v = value; @@ -200,10 +200,10 @@ void fmt_PrintNumber(char *buf, size_t bufLen, struct FormatSpec const *fmt, uin : fmt->type == 'o' ? '&' : 0; - char valueBuf[262]; /* Max 5 digits + decimal + 255 fraction digits + terminator */ + char valueBuf[262]; // Max 5 digits + decimal + 255 fraction digits + terminator if (fmt->type == 'b') { - /* Special case for binary */ + // Special case for binary char *ptr = valueBuf; do { @@ -213,7 +213,7 @@ void fmt_PrintNumber(char *buf, size_t bufLen, struct FormatSpec const *fmt, uin *ptr = '\0'; - /* Reverse the digits */ + // Reverse the digits size_t valueLen = ptr - valueBuf; for (size_t i = 0, j = valueLen - 1; i < j; i++, j--) { @@ -223,9 +223,9 @@ void fmt_PrintNumber(char *buf, size_t bufLen, struct FormatSpec const *fmt, uin valueBuf[j] = c; } } else if (fmt->type == 'f') { - /* Special case for fixed-point */ + // Special case for fixed-point - /* Default fractional width (C's is 6 for "%f"; here 5 is enough) */ + // Default fractional width (C's is 6 for "%f"; here 5 is enough) size_t fracWidth = fmt->hasFrac ? fmt->fracWidth : 5; if (fracWidth > 255) { @@ -250,7 +250,7 @@ void fmt_PrintNumber(char *buf, size_t bufLen, struct FormatSpec const *fmt, uin size_t numLen = !!sign + !!prefix + len; size_t totalLen = fmt->width > numLen ? fmt->width : numLen; - if (totalLen > bufLen - 1) { /* bufLen includes terminator */ + if (totalLen > bufLen - 1) { // bufLen includes terminator error("Formatted numeric value too long\n"); totalLen = bufLen - 1; if (numLen > totalLen) { @@ -273,7 +273,7 @@ void fmt_PrintNumber(char *buf, size_t bufLen, struct FormatSpec const *fmt, uin buf[i] = ' '; } else { if (fmt->padZero) { - /* sign, then prefix, then zero padding */ + // sign, then prefix, then zero padding if (sign) buf[pos++] = sign; if (prefix) @@ -281,7 +281,7 @@ void fmt_PrintNumber(char *buf, size_t bufLen, struct FormatSpec const *fmt, uin for (size_t i = 0; i < padLen; i++) buf[pos++] = '0'; } else { - /* space padding, then sign, then prefix */ + // space padding, then sign, then prefix for (size_t i = 0; i < padLen; i++) buf[pos++] = ' '; if (sign) diff --git a/src/asm/fstack.c b/src/asm/fstack.c index b118cd81..791aa13b 100644 --- a/src/asm/fstack.c +++ b/src/asm/fstack.c @@ -19,7 +19,7 @@ #include "asm/main.h" #include "asm/symbol.h" #include "asm/warning.h" -#include "platform.h" /* S_ISDIR (stat macro) */ +#include "platform.h" // S_ISDIR (stat macro) #define MAXINCPATHS 128 @@ -28,7 +28,7 @@ struct Context { struct FileStackNode *fileInfo; struct LexerState *lexerState; uint32_t uniqueID; - struct MacroArgs *macroArgs; /* Macro args are *saved* here */ + struct MacroArgs *macroArgs; // Macro args are *saved* here uint32_t nbReptIters; int32_t forValue; int32_t forStep; @@ -47,7 +47,7 @@ static const char *dumpNodeAndParents(struct FileStackNode const *node) char const *name; if (node->type == NODE_REPT) { - assert(node->parent); /* REPT nodes should always have a parent */ + assert(node->parent); // REPT nodes should always have a parent struct FileStackReptNode const *reptInfo = (struct FileStackReptNode const *)node; name = dumpNodeAndParents(node->parent); @@ -88,7 +88,7 @@ struct FileStackNode *fstk_GetFileStack(void) struct FileStackNode *node = contextStack->fileInfo; - /* Mark node and all of its parents as referenced if not already so they don't get freed */ + // Mark node and all of its parents as referenced if not already so they don't get freed while (node && !node->referenced) { node->ID = -1; node->referenced = true; @@ -99,7 +99,7 @@ struct FileStackNode *fstk_GetFileStack(void) char const *fstk_GetFileName(void) { - /* Iterating via the nodes themselves skips nested REPTs */ + // Iterating via the nodes themselves skips nested REPTs struct FileStackNode const *node = contextStack->fileInfo; while (node->type != NODE_FILE) @@ -120,7 +120,7 @@ void fstk_AddIncludePath(char const *path) char *str = malloc(allocSize); if (!str) { - /* Attempt to continue without that path */ + // Attempt to continue without that path error("Failed to allocate new include path: %s\n", strerror(errno)); return; } @@ -149,14 +149,14 @@ static bool isPathValid(char const *path) if (stat(path, &statbuf) != 0) return false; - /* Reject directories */ + // Reject directories return !S_ISDIR(statbuf.st_mode); } bool fstk_FindFile(char const *path, char **fullPath, size_t *size) { if (!*size) { - *size = 64; /* This is arbitrary, really */ + *size = 64; // This is arbitrary, really *fullPath = realloc(*fullPath, *size); if (!*fullPath) error("realloc error during include path search: %s\n", @@ -174,8 +174,8 @@ bool fstk_FindFile(char const *path, char **fullPath, size_t *size) break; } - /* Oh how I wish `asnprintf` was standard... */ - if ((size_t)len >= *size) { /* `len` doesn't include the terminator, `size` does */ + // Oh how I wish `asnprintf` was standard... + if ((size_t)len >= *size) { // `size` includes the terminator, `len` doesn't *size = len + 1; *fullPath = realloc(*fullPath, *size); if (!*fullPath) { @@ -212,17 +212,18 @@ bool yywrap(void) fatalerror("Ended block with %" PRIu32 " unterminated IF construct%s\n", ifDepth, ifDepth == 1 ? "" : "s"); - if (contextStack->fileInfo->type == NODE_REPT) { /* The context is a REPT block, which may loop */ + if (contextStack->fileInfo->type == NODE_REPT) { + // The context is a REPT or FOR block, which may loop struct FileStackReptNode *fileInfo = (struct FileStackReptNode *)contextStack->fileInfo; - /* If the node is referenced, we can't edit it; duplicate it */ + // If the node is referenced, we can't edit it; duplicate it if (contextStack->fileInfo->referenced) { size_t size = sizeof(*fileInfo) + sizeof(fileInfo->iters[0]) * fileInfo->reptDepth; struct FileStackReptNode *copy = malloc(size); if (!copy) fatalerror("Failed to duplicate REPT file node: %s\n", strerror(errno)); - /* Copy all info but the referencing */ + // Copy all info but the referencing memcpy(copy, fileInfo, size); copy->node.next = NULL; copy->node.referenced = false; @@ -231,19 +232,19 @@ bool yywrap(void) contextStack->fileInfo = (struct FileStackNode *)fileInfo; } - /* If this is a FOR, update the symbol value */ + // If this is a FOR, update the symbol value if (contextStack->forName && fileInfo->iters[0] <= contextStack->nbReptIters) { contextStack->forValue += contextStack->forStep; struct Symbol *sym = sym_AddVar(contextStack->forName, contextStack->forValue); - /* This error message will refer to the current iteration */ + // This error message will refer to the current iteration if (sym->type != SYM_VAR) fatalerror("Failed to update FOR symbol value\n"); } - /* Advance to the next iteration */ + // Advance to the next iteration fileInfo->iters[0]++; - /* If this wasn't the last iteration, wrap instead of popping */ + // If this wasn't the last iteration, wrap instead of popping if (fileInfo->iters[0] <= contextStack->nbReptIters) { lexer_RestartRept(contextStack->fileInfo->lineNo); contextStack->uniqueID = macro_UseNewUniqueID(); @@ -260,15 +261,15 @@ bool yywrap(void) contextDepth--; lexer_DeleteState(context->lexerState); - /* Restore args if a macro (not REPT) saved them */ + // Restore args if a macro (not REPT) saved them if (context->fileInfo->type == NODE_MACRO) macro_UseNewArgs(contextStack->macroArgs); - /* Free the file stack node */ + // Free the file stack node if (!context->fileInfo->referenced) free(context->fileInfo); - /* Free the FOR symbol name */ + // Free the FOR symbol name free(context->forName); - /* Free the entry and make its parent the current entry */ + // Free the entry and make its parent the current entry free(context); lexer_SetState(contextStack->lexerState); @@ -276,11 +277,9 @@ bool yywrap(void) return false; } -/* - * Make sure not to switch the lexer state before calling this, so the saved line no is correct - * BE CAREFUL!! This modifies the file stack directly, you should have set up the file info first - * Callers should set contextStack->lexerState after this so it is not NULL - */ +// Make sure not to switch the lexer state before calling this, so the saved line no is correct. +// BE CAREFUL!! This modifies the file stack directly, you should have set up the file info first. +// Callers should set contextStack->lexerState after this so it is not NULL. static void newContext(struct FileStackNode *fileInfo) { ++contextDepth; @@ -291,15 +290,14 @@ static void newContext(struct FileStackNode *fileInfo) if (!context) fatalerror("Failed to allocate memory for new context: %s\n", strerror(errno)); fileInfo->parent = contextStack->fileInfo; - fileInfo->lineNo = 0; /* Init to a default value, see struct definition for info */ + fileInfo->lineNo = 0; // Init to a default value, see struct definition for info fileInfo->referenced = false; fileInfo->lineNo = lexer_GetLineNo(); context->fileInfo = fileInfo; context->forName = NULL; - /* - * Link new entry to its parent so it's reachable later - * ERRORS SHOULD NOT OCCUR AFTER THIS!! - */ + + // Link new entry to its parent so it's reachable later + // ERRORS SHOULD NOT OCCUR AFTER THIS!! context->parent = contextStack; contextStack = context; } @@ -337,7 +335,7 @@ void fstk_RunInclude(char const *path) if (!contextStack->lexerState) fatalerror("Failed to set up lexer for file include\n"); lexer_SetStateAtEOL(contextStack->lexerState); - /* We're back at top-level, so most things are reset */ + // We're back at top-level, so most things are reset contextStack->uniqueID = 0; macro_SetUniqueID(0); } @@ -356,16 +354,16 @@ void fstk_RunMacro(char const *macroName, struct MacroArgs *args) } contextStack->macroArgs = macro_GetCurrentArgs(); - /* Compute total length of this node's name: :: */ + // Compute total length of this node's name: :: size_t reptNameLen = 0; struct FileStackNode const *node = macro->src; if (node->type == NODE_REPT) { struct FileStackReptNode const *reptNode = (struct FileStackReptNode const *)node; - /* 4294967295 = 2^32 - 1, aka UINT32_MAX */ + // 4294967295 = 2^32 - 1, aka UINT32_MAX reptNameLen += reptNode->reptDepth * strlen("::REPT~4294967295"); - /* Look for next named node */ + // Look for next named node do { node = node->parent; } while (node->type == NODE_REPT); @@ -381,7 +379,7 @@ void fstk_RunMacro(char const *macroName, struct MacroArgs *args) return; } fileInfo->node.type = NODE_MACRO; - /* Print the name... */ + // Print the name... char *dest = fileInfo->name; memcpy(dest, baseNode->name, baseLen); @@ -428,13 +426,13 @@ static bool newReptContext(int32_t reptLineNo, char *body, size_t size) fileInfo->reptDepth = reptDepth + 1; fileInfo->iters[0] = 1; if (reptDepth) - /* Copy all parent iter counts */ + // Copy all parent iter counts memcpy(&fileInfo->iters[1], ((struct FileStackReptNode *)contextStack->fileInfo)->iters, reptDepth * sizeof(fileInfo->iters[0])); newContext((struct FileStackNode *)fileInfo); - /* Correct our line number, which currently points to the `ENDR` line */ + // Correct our line number, which currently points to the `ENDR` line contextStack->fileInfo->lineNo = reptLineNo; contextStack->lexerState = lexer_OpenFileView("REPT", body, size, reptLineNo); @@ -492,7 +490,7 @@ void fstk_RunFor(char const *symName, int32_t start, int32_t stop, int32_t step, void fstk_StopRept(void) { - /* Prevent more iterations */ + // Prevent more iterations contextStack->nbReptIters = 0; } @@ -532,7 +530,7 @@ void fstk_Init(char const *mainPath, size_t maxDepth) fatalerror("Failed to allocate memory for main file info: %s\n", strerror(errno)); context->fileInfo = (struct FileStackNode *)fileInfo; - /* lineNo and reptIter are unused on the top-level context */ + // lineNo and reptIter are unused on the top-level context context->fileInfo->parent = NULL; context->fileInfo->lineNo = 0; // This still gets written to the object file, so init it context->fileInfo->referenced = false; @@ -548,13 +546,11 @@ void fstk_Init(char const *mainPath, size_t maxDepth) context->forStep = 0; context->forName = NULL; - /* Now that it's set up properly, register the context */ + // Now that it's set up properly, register the context contextStack = context; - /* - * Check that max recursion depth won't allow overflowing node `malloc`s - * This assumes that the rept node is larger - */ + // Check that max recursion depth won't allow overflowing node `malloc`s + // This assumes that the rept node is larger #define DEPTH_LIMIT ((SIZE_MAX - sizeof(struct FileStackReptNode)) / sizeof(uint32_t)) if (maxDepth > DEPTH_LIMIT) { error("Recursion depth may not be higher than %zu, defaulting to " @@ -563,7 +559,7 @@ void fstk_Init(char const *mainPath, size_t maxDepth) } else { maxRecursionDepth = maxDepth; } - /* Make sure that the default of 64 is OK, though */ + // Make sure that the default of 64 is OK, though assert(DEPTH_LIMIT >= DEFAULT_MAX_DEPTH); #undef DEPTH_LIMIT } diff --git a/src/asm/lexer.c b/src/asm/lexer.c index 6881029b..fb07bec8 100644 --- a/src/asm/lexer.c +++ b/src/asm/lexer.c @@ -24,7 +24,7 @@ #include #endif -#include "platform.h" /* For `ssize_t` */ +#include "platform.h" // For `ssize_t` #include "asm/lexer.h" #include "asm/format.h" @@ -35,10 +35,10 @@ #include "asm/symbol.h" #include "asm/util.h" #include "asm/warning.h" -/* Include this last so it gets all type & constant definitions */ -#include "parser.h" /* For token definitions, generated from parser.y */ +// Include this last so it gets all type & constant definitions +#include "parser.h" // For token definitions, generated from parser.y -/* Neither MSVC nor MinGW provide `mmap` */ +// Neither MSVC nor MinGW provide `mmap` #if defined(_MSC_VER) || defined(__MINGW32__) # define WIN32_LEAN_AND_MEAN // include less from windows.h # include // target architecture @@ -63,7 +63,7 @@ } while (0) # define munmap(ptr, size) UnmapViewOfFile((ptr)) -#else /* defined(_MSC_VER) || defined(__MINGW32__) */ +#else // defined(_MSC_VER) || defined(__MINGW32__) # include # define mapFile(ptr, fd, path, size) do { \ @@ -80,23 +80,19 @@ (ptr) = mmap(NULL, (size), PROT_READ, MAP_SHARED, (fd), 0); \ } \ } while (0) -#endif /* !( defined(_MSC_VER) || defined(__MINGW32__) ) */ +#endif // !( defined(_MSC_VER) || defined(__MINGW32__) ) -/* - * Identifiers that are also keywords are listed here. This ONLY applies to ones - * that would normally be matched as identifiers! Check out `yylex_NORMAL` to - * see how this is used. - * Tokens / keywords not handled here are handled in `yylex_NORMAL`'s switch. - */ +// Identifiers that are also keywords are listed here. This ONLY applies to ones +// that would normally be matched as identifiers! Check out `yylex_NORMAL` to +// see how this is used. +// Tokens / keywords not handled here are handled in `yylex_NORMAL`'s switch. static struct KeywordMapping { char const *name; int token; } const keywords[] = { - /* - * CAUTION when editing this: adding keywords will probably require extra nodes in the - * `keywordDict` array. If you forget to, you will probably trip up an assertion, anyways. - * Also, all entries in this array must be in uppercase for the dict to build correctly. - */ + // CAUTION when editing this: adding keywords will probably require extra nodes in the + // `keywordDict` array. If you forget to, you will probably trip up an assertion, anyways. + // Also, all entries in this array must be in uppercase for the dict to build correctly. {"ADC", T_Z80_ADC}, {"ADD", T_Z80_ADD}, {"AND", T_Z80_AND}, @@ -136,7 +132,7 @@ static struct KeywordMapping { {"RST", T_Z80_RST}, {"SBC", T_Z80_SBC}, {"SCF", T_Z80_SCF}, - {"SET", T_POP_SET}, + {"SET", T_Z80_SET}, {"SLA", T_Z80_SLA}, {"SRA", T_Z80_SRA}, {"SRL", T_Z80_SRL}, @@ -148,8 +144,8 @@ static struct KeywordMapping { {"NZ", T_CC_NZ}, {"Z", T_CC_Z}, {"NC", T_CC_NC}, - /* Handled after as T_TOKEN_C */ - /* { "C", T_CC_C }, */ + // Handled after as T_TOKEN_C + // { "C", T_CC_C }, {"AF", T_MODE_AF}, {"BC", T_MODE_BC}, @@ -269,8 +265,8 @@ static struct KeywordMapping { {"RB", T_POP_RB}, {"RW", T_POP_RW}, - /* Handled before as T_Z80_RL */ - /* {"RL", T_POP_RL}, */ + // Handled before as T_Z80_RL + // {"RL", T_POP_RL}, {"EQU", T_POP_EQU}, {"EQUS", T_POP_EQUS}, @@ -291,10 +287,10 @@ static bool isWhitespace(int c) return c == ' ' || c == '\t'; } -#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 */ +#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 */ +// 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"); struct Expansion { @@ -304,38 +300,38 @@ struct Expansion { char const *unowned; char *owned; } contents; - size_t size; /* Length of the contents */ - size_t offset; /* Cursor into the contents */ - bool owned; /* Whether or not to free contents when this expansion is freed */ + size_t size; // Length of the contents + size_t offset; // Cursor into the contents + bool owned; // Whether or not to free contents when this expansion is freed }; struct IfStack { struct IfStack *next; - bool ranIfBlock; /* Whether an IF/ELIF/ELSE block ran already */ - bool reachedElseBlock; /* Whether an ELSE block ran already */ + bool ranIfBlock; // Whether an IF/ELIF/ELSE block ran already + bool reachedElseBlock; // Whether an ELSE block ran already }; struct LexerState { char const *path; - /* mmap()-dependent IO state */ + // mmap()-dependent IO state bool isMmapped; union { - struct { /* If mmap()ed */ - char *ptr; /* Technically `const` during the lexer's execution */ + struct { // If mmap()ed + char *ptr; // Technically `const` during the lexer's execution size_t size; size_t offset; - bool isReferenced; /* If a macro in this file requires not unmapping it */ + bool isReferenced; // If a macro in this file requires not unmapping it }; - struct { /* Otherwise */ + struct { // Otherwise int fd; - size_t index; /* Read index into the buffer */ - char buf[LEXER_BUF_SIZE]; /* Circular buffer */ - size_t nbChars; /* Number of "fresh" chars in the buffer */ + size_t index; // Read index into the buffer + char buf[LEXER_BUF_SIZE]; // Circular buffer + size_t nbChars; // Number of "fresh" chars in the buffer }; }; - /* Common state */ + // Common state bool isFile; enum LexerMode mode; @@ -346,16 +342,16 @@ struct LexerState { struct IfStack *ifStack; - bool capturing; /* Whether the text being lexed should be captured */ - size_t captureSize; /* Amount of text captured */ - char *captureBuf; /* Buffer to send the captured text to if non-NULL */ - size_t captureCapacity; /* Size of the buffer above */ + bool capturing; // Whether the text being lexed should be captured + size_t captureSize; // Amount of text captured + char *captureBuf; // Buffer to send the captured text to if non-NULL + size_t captureCapacity; // Size of the buffer above bool disableMacroArgs; bool disableInterpolation; - size_t macroArgScanDistance; /* Max distance already scanned for macro args */ + size_t macroArgScanDistance; // Max distance already scanned for macro args bool expandStrings; - struct Expansion *expansions; /* Points to the innermost current expansion */ + struct Expansion *expansions; // Points to the innermost current expansion }; struct LexerState *lexerState = NULL; @@ -364,7 +360,7 @@ struct LexerState *lexerStateEOL = NULL; static void initState(struct LexerState *state) { state->mode = LEXER_NORMAL; - state->atLineStart = true; /* yylex() will init colNo due to this */ + state->atLineStart = true; // yylex() will init colNo due to this state->lastToken = T_EOF; state->ifStack = NULL; @@ -447,7 +443,7 @@ struct LexerState *lexer_OpenFile(char const *path) struct LexerState *state = malloc(sizeof(*state)); struct stat fileInfo; - /* Give stdin a nicer file name */ + // Give stdin a nicer file name if (isStdin) path = ""; if (!state) { @@ -467,23 +463,21 @@ struct LexerState *lexer_OpenFile(char const *path) free(state); return NULL; } - state->isMmapped = false; /* By default, assume it won't be mmap()ed */ + state->isMmapped = false; // By default, assume it won't be mmap()ed if (!isStdin && fileInfo.st_size > 0) { - /* Try using `mmap` for better performance */ + // Try using `mmap` for better performance - /* - * Important: do NOT assign to `state->ptr` directly, to avoid a cast that may - * alter an eventual `MAP_FAILED` value. It would also invalidate `state->fd`, - * being on the other side of the union. - */ + // Important: do NOT assign to `state->ptr` directly, to avoid a cast that may + // alter an eventual `MAP_FAILED` value. It would also invalidate `state->fd`, + // being on the other side of the union. void *mappingAddr; mapFile(mappingAddr, state->fd, state->path, fileInfo.st_size); if (mappingAddr == MAP_FAILED) { - /* If mmap()ing failed, try again using another method (below) */ + // If mmap()ing failed, try again using another method (below) state->isMmapped = false; } else { - /* IMPORTANT: the `union` mandates this is accessed before other members! */ + // IMPORTANT: the `union` mandates this is accessed before other members! close(state->fd); state->isMmapped = true; @@ -498,7 +492,7 @@ struct LexerState *lexer_OpenFile(char const *path) } } if (!state->isMmapped) { - /* Sometimes mmap() fails or isn't available, so have a fallback */ + // Sometimes mmap() fails or isn't available, so have a fallback if (verbose) { if (isStdin) printf("Opening stdin\n"); @@ -513,7 +507,7 @@ struct LexerState *lexer_OpenFile(char const *path) } initState(state); - state->lineNo = 0; /* Will be incremented at first line start */ + state->lineNo = 0; // Will be incremented at first line start return state; } @@ -526,15 +520,15 @@ struct LexerState *lexer_OpenFileView(char const *path, char *buf, size_t size, return NULL; } - state->path = path; /* Used to report read errors in `peekInternal` */ + 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->isMmapped = true; // It's not *really* mmap()ed, but it behaves the same state->ptr = buf; state->size = size; state->offset = 0; initState(state); - state->lineNo = lineNo; /* Will be incremented at first line start */ + state->lineNo = lineNo; // Will be incremented at first line start return state; } @@ -568,22 +562,20 @@ void lexer_DeleteState(struct LexerState *state) } struct KeywordDictNode { - /* - * The identifier charset is (currently) 44 characters big. By storing entries for the - * entire printable ASCII charset, minus lower-case due to case-insensitivity, - * we only waste (0x60 - 0x20) - 70 = 20 entries per node, which should be acceptable. - * In turn, this allows greatly simplifying checking an index into this array, - * which should help speed up the lexer. - */ + // The identifier charset is (currently) 44 characters big. By storing entries for the + // entire printable ASCII charset, minus lower-case due to case-insensitivity, + // we only waste (0x60 - 0x20) - 70 = 20 entries per node, which should be acceptable. + // In turn, this allows greatly simplifying checking an index into this array, + // which should help speed up the lexer. uint16_t children[0x60 - ' ']; struct KeywordMapping const *keyword; -/* Since the keyword structure is invariant, the min number of nodes is known at compile time */ -} keywordDict[365] = {0}; /* Make sure to keep this correct when adding keywords! */ +// Since the keyword structure is invariant, the min number of nodes is known at compile time +} keywordDict[365] = {0}; // Make sure to keep this correct when adding keywords! -/* Convert a char into its index into the dict */ +// Convert a char into its index into the dict static uint8_t dictIndex(char c) { - /* Translate uppercase to lowercase (roughly) */ + // Translate uppercase to lowercase (roughly) if (c > 0x60) c = c - ('a' - 'A'); return c - ' '; @@ -591,42 +583,38 @@ static uint8_t dictIndex(char c) void lexer_Init(void) { - /* - * Build the dictionary of keywords. This could be done at compile time instead, however: - * - Doing so manually is a task nobody wants to undertake - * - It would be massively hard to read - * - Doing it within CC or CPP would be quite non-trivial - * - Doing it externally would require some extra work to use only POSIX tools - * - The startup overhead isn't much compared to the program's - */ + // Build the dictionary of keywords. This could be done at compile time instead, however: + // - Doing so manually is a task nobody wants to undertake + // - It would be massively hard to read + // - Doing it within CC or CPP would be quite non-trivial + // - Doing it externally would require some extra work to use only POSIX tools + // - The startup overhead isn't much compared to the program's uint16_t usedNodes = 1; for (size_t i = 0; i < ARRAY_SIZE(keywords); i++) { uint16_t nodeID = 0; - /* Walk the dictionary, creating intermediate nodes for the keyword */ + // Walk the dictionary, creating intermediate nodes for the keyword for (char const *ptr = keywords[i].name; *ptr; ptr++) { - /* We should be able to assume all entries are well-formed */ + // We should be able to assume all entries are well-formed if (keywordDict[nodeID].children[*ptr - ' '] == 0) { - /* - * If this gets tripped up, set the size of keywordDict to - * something high, compile with `-DPRINT_NODE_COUNT` (see below), - * and set the size to that. - */ + // If this gets tripped up, set the size of keywordDict to + // something high, compile with `-DPRINT_NODE_COUNT` (see below), + // and set the size to that. assert(usedNodes < sizeof(keywordDict) / sizeof(*keywordDict)); - /* There is no node at that location, grab one from the pool */ + // There is no node at that location, grab one from the pool keywordDict[nodeID].children[*ptr - ' '] = usedNodes; usedNodes++; } nodeID = keywordDict[nodeID].children[*ptr - ' ']; } - /* This assumes that no two keywords have the same name */ + // This assumes that no two keywords have the same name keywordDict[nodeID].keyword = &keywords[i]; } -#ifdef PRINT_NODE_COUNT /* For the maintainer to check how many nodes are needed */ +#ifdef PRINT_NODE_COUNT // For the maintainer to check how many nodes are needed printf("Lexer keyword dictionary: %zu keywords in %u nodes (pool size %zu)\n", ARRAY_SIZE(keywords), usedNodes, ARRAY_SIZE(keywordDict)); #endif @@ -642,7 +630,7 @@ void lexer_ToggleStringExpansion(bool enable) lexerState->expandStrings = enable; } -/* Functions for the actual lexer to obtain characters */ +// Functions for the actual lexer to obtain characters static void reallocCaptureBuf(void) { @@ -661,7 +649,7 @@ static void beginExpansion(char const *str, bool owned, char const *name) { size_t size = strlen(str); - /* Do not expand empty strings */ + // Do not expand empty strings if (!size) return; @@ -706,7 +694,7 @@ static bool isMacroChar(char c) return c == '@' || c == '#' || c == '<' || (c >= '0' && c <= '9'); } -/* forward declarations for readBracketedMacroArgNum */ +// forward declarations for readBracketedMacroArgNum static int peek(void); static void shiftChar(void); static uint32_t readNumber(int radix, uint32_t baseValue); @@ -822,14 +810,12 @@ static size_t readInternal(size_t bufIndex, size_t nbChars) return (size_t)nbReadChars; } -/* We only need one character of lookahead, for macro arguments */ +// We only need one character of lookahead, for macro arguments static int peekInternal(uint8_t distance) { for (struct Expansion *exp = lexerState->expansions; exp; exp = exp->parent) { - /* - * An expansion that has reached its end will have `exp->offset` == `exp->size`, - * and `peekInternal` will continue with its parent - */ + // An expansion that has reached its end will have `exp->offset` == `exp->size`, + // and `peekInternal` will continue with its parent assert(exp->offset <= exp->size); if (distance < exp->size - exp->offset) return exp->contents.unowned[exp->offset + distance]; @@ -848,13 +834,13 @@ static int peekInternal(uint8_t distance) } if (lexerState->nbChars <= distance) { - /* Buffer isn't full enough, read some chars in */ - size_t target = LEXER_BUF_SIZE - lexerState->nbChars; /* Aim: making the buf full */ + // Buffer isn't full enough, read some chars in + size_t target = LEXER_BUF_SIZE - lexerState->nbChars; // Aim: making the buf full - /* Compute the index we'll start writing to */ + // Compute the index we'll start writing to size_t writeIndex = (lexerState->index + lexerState->nbChars) % LEXER_BUF_SIZE; - /* If the range to fill passes over the buffer wrapping point, we need two reads */ + // If the range to fill passes over the buffer wrapping point, we need two reads if (writeIndex + target > LEXER_BUF_SIZE) { size_t nbExpectedChars = LEXER_BUF_SIZE - writeIndex; size_t nbReadChars = readInternal(writeIndex, nbExpectedChars); @@ -873,7 +859,7 @@ static int peekInternal(uint8_t distance) if (target != 0) lexerState->nbChars += readInternal(writeIndex, target); - /* If there aren't enough chars even after refilling, give up */ + // If there aren't enough chars even after refilling, give up if (lexerState->nbChars <= distance) return EOF; } @@ -881,7 +867,7 @@ static int peekInternal(uint8_t distance) return (unsigned char)lexerState->buf[(lexerState->index + distance) % LEXER_BUF_SIZE]; } -/* forward declarations for peek */ +// forward declarations for peek static void shiftChar(void); static char const *readInterpolation(size_t depth); @@ -892,10 +878,10 @@ static int peek(void) if (lexerState->macroArgScanDistance > 0) return c; - lexerState->macroArgScanDistance++; /* Do not consider again */ + lexerState->macroArgScanDistance++; // Do not consider again if (c == '\\' && !lexerState->disableMacroArgs) { - /* If character is a backslash, check for a macro arg */ + // If character is a backslash, check for a macro arg lexerState->macroArgScanDistance++; c = peekInternal(1); if (isMacroChar(c)) { @@ -903,19 +889,15 @@ static int peek(void) shiftChar(); char const *str = readMacroArg(c); - /* - * If the macro arg is invalid or an empty string, it cannot be - * expanded, so skip it and keep peeking. - */ + // If the macro arg is invalid or an empty string, it cannot be + // expanded, so skip it and keep peeking. if (!str || !str[0]) return peek(); beginExpansion(str, c == '#', NULL); - /* - * Assuming macro args can't be recursive (I'll be damned if a way - * is found...), then we mark the entire macro arg as scanned. - */ + // Assuming macro args can't be recursive (I'll be damned if a way + // is found...), then we mark the entire macro arg as scanned. lexerState->macroArgScanDistance += strlen(str); c = str[0]; @@ -923,7 +905,7 @@ static int peek(void) c = '\\'; } } else if (c == '{' && !lexerState->disableInterpolation) { - /* If character is an open brace, do symbol interpolation */ + // If character is an open brace, do symbol interpolation shiftChar(); char const *str = readInterpolation(0); @@ -941,7 +923,7 @@ static void shiftChar(void) if (lexerState->captureBuf) { if (lexerState->captureSize + 1 >= lexerState->captureCapacity) reallocCaptureBuf(); - /* TODO: improve this? */ + // TODO: improve this? lexerState->captureBuf[lexerState->captureSize] = peek(); } lexerState->captureSize++; @@ -951,14 +933,12 @@ static void shiftChar(void) restart: if (lexerState->expansions) { - /* Advance within the current expansion */ + // Advance within the current expansion assert(lexerState->expansions->offset <= lexerState->expansions->size); lexerState->expansions->offset++; if (lexerState->expansions->offset > lexerState->expansions->size) { - /* - * When advancing would go past an expansion's end, free it, - * move up to its parent, and try again to advance - */ + // When advancing would go past an expansion's end, free it, + // move up to its parent, and try again to advance struct Expansion *exp = lexerState->expansions; lexerState->expansions = lexerState->expansions->parent; @@ -966,7 +946,7 @@ restart: goto restart; } } else { - /* Advance within the file contents */ + // Advance within the file contents lexerState->colNo++; if (lexerState->isMmapped) { lexerState->offset++; @@ -974,7 +954,7 @@ restart: assert(lexerState->index < LEXER_BUF_SIZE); lexerState->index++; if (lexerState->index == LEXER_BUF_SIZE) - lexerState->index = 0; /* Wrap around if necessary */ + lexerState->index = 0; // Wrap around if necessary assert(lexerState->nbChars > 0); lexerState->nbChars--; } @@ -985,7 +965,7 @@ static int nextChar(void) { int c = peek(); - /* If not at EOF, advance read position */ + // If not at EOF, advance read position if (c != EOF) shiftChar(); return c; @@ -997,7 +977,7 @@ static void handleCRLF(int c) shiftChar(); } -/* "Services" provided by the lexer to the rest of the program */ +// "Services" provided by the lexer to the rest of the program char const *lexer_GetFileName(void) { @@ -1020,13 +1000,13 @@ void lexer_DumpStringExpansions(void) return; for (struct Expansion *exp = lexerState->expansions; exp; exp = exp->parent) { - /* Only register EQUS expansions, not string args */ + // Only register EQUS expansions, not string args if (exp->name) fprintf(stderr, "while expanding symbol \"%s\"\n", exp->name); } } -/* Discards a block comment */ +// Discards a block comment static void discardBlockComment(void) { lexerState->disableMacroArgs = true; @@ -1039,9 +1019,9 @@ static void discardBlockComment(void) error("Unterminated block comment\n"); goto finish; case '\r': - /* Handle CRLF before nextLine() since shiftChar updates colNo */ + // Handle CRLF before nextLine() since shiftChar updates colNo handleCRLF(c); - /* fallthrough */ + // fallthrough case '\n': if (!lexerState->expansions) nextLine(); @@ -1057,7 +1037,7 @@ static void discardBlockComment(void) shiftChar(); goto finish; } - /* fallthrough */ + // fallthrough default: continue; } @@ -1067,7 +1047,7 @@ finish: lexerState->disableInterpolation = false; } -/* Function to discard all of a line's comments */ +// Function to discard all of a line's comments static void discardComment(void) { @@ -1083,7 +1063,7 @@ static void discardComment(void) lexerState->disableInterpolation = false; } -/* Function to read a line continuation */ +// Function to read a line continuation static void readLineContinuation(void) { @@ -1094,7 +1074,7 @@ static void readLineContinuation(void) shiftChar(); } else if (c == '\r' || c == '\n') { shiftChar(); - /* Handle CRLF before nextLine() since shiftChar updates colNo */ + // Handle CRLF before nextLine() since shiftChar updates colNo handleCRLF(c); if (!lexerState->expansions) nextLine(); @@ -1109,7 +1089,7 @@ static void readLineContinuation(void) } } -/* Function to read an anonymous label ref */ +// Function to read an anonymous label ref static void readAnonLabelRef(char c) { @@ -1124,7 +1104,7 @@ static void readAnonLabelRef(char c) sym_WriteAnonLabelName(yylval.symName, n, c == '-'); } -/* Functions to lex numbers of various radixes */ +// Functions to lex numbers of various radixes static uint32_t readNumber(int radix, uint32_t baseValue) { @@ -1159,7 +1139,7 @@ static uint32_t readFractionalPart(int32_t integer) if (divisor > (UINT32_MAX - (c - '0')) / 10) { warning(WARNING_LARGE_CONSTANT, "Precision of fixed-point constant is too large\n"); - /* Discard any additional digits */ + // Discard any additional digits shiftChar(); while (c = peek(), (c >= '0' && c <= '9') || c == '_') shiftChar(); @@ -1172,9 +1152,9 @@ static uint32_t readFractionalPart(int32_t integer) if (integer > INT16_MAX || integer < INT16_MIN) warning(WARNING_LARGE_CONSTANT, "Magnitude of fixed-point constant is too large\n"); - /* Cast to unsigned avoids UB if shifting discards bits */ + // Cast to unsigned avoids UB if shifting discards bits integer = (uint32_t)integer << 16; - /* Cast to unsigned avoids undefined overflow behavior */ + // Cast to unsigned avoids undefined overflow behavior uint16_t fractional = (uint16_t)round(value * 65536.0 / divisor); return (uint32_t)integer | (fractional * (integer >= 0 ? 1 : -1)); @@ -1281,7 +1261,7 @@ static uint32_t readGfxConstant(void) return bitPlaneUpper << 8 | bitPlaneLower; } -/* Functions to read identifiers & keywords */ +// Functions to read identifiers & keywords static bool startsIdentifier(int c) { @@ -1296,26 +1276,26 @@ static bool continuesIdentifier(int c) static int readIdentifier(char firstChar) { - /* Lex while checking for a keyword */ + // Lex while checking for a keyword yylval.symName[0] = firstChar; uint16_t nodeID = keywordDict[0].children[dictIndex(firstChar)]; int tokenType = firstChar == '.' ? T_LOCAL_ID : T_ID; size_t i = 1; - /* Continue reading while the char is in the symbol charset */ + // Continue reading while the char is in the symbol charset for (int c = peek(); continuesIdentifier(c); i++, c = peek()) { shiftChar(); if (i < sizeof(yylval.symName) - 1) { - /* Write the char to the identifier's name */ + // Write the char to the identifier's name yylval.symName[i] = c; - /* If the char was a dot, mark the identifier as local */ + // If the char was a dot, mark the identifier as local if (c == '.') tokenType = T_LOCAL_ID; - /* Attempt to traverse the tree to check for a keyword */ - if (nodeID) /* Do nothing if matching already failed */ + // Attempt to traverse the tree to check for a keyword + if (nodeID) // Do nothing if matching already failed nodeID = keywordDict[nodeID].children[dictIndex(c)]; } } @@ -1324,7 +1304,7 @@ static int readIdentifier(char firstChar) warning(WARNING_LONG_STR, "Symbol name too long, got truncated\n"); i = sizeof(yylval.symName) - 1; } - yylval.symName[i] = '\0'; /* Terminate the string */ + yylval.symName[i] = '\0'; // Terminate the string if (keywordDict[nodeID].keyword) return keywordDict[nodeID].keyword->token; @@ -1332,7 +1312,7 @@ static int readIdentifier(char firstChar) return tokenType; } -/* Functions to read strings */ +// Functions to read strings static char const *readInterpolation(size_t depth) { @@ -1344,30 +1324,28 @@ static char const *readInterpolation(size_t depth) struct FormatSpec fmt = fmt_NewSpec(); bool disableInterpolation = lexerState->disableInterpolation; - /* - * In a context where `lexerState->disableInterpolation` is true, `peek` will expand - * nested interpolations itself, which can lead to stack overflow. This lets - * `readInterpolation` handle its own nested expansions, increasing `depth` each time. - */ + // In a context where `lexerState->disableInterpolation` is true, `peek` will expand + // nested interpolations itself, which can lead to stack overflow. This lets + // `readInterpolation` handle its own nested expansions, increasing `depth` each time. lexerState->disableInterpolation = true; for (;;) { int c = peek(); - if (c == '{') { /* Nested interpolation */ + if (c == '{') { // Nested interpolation shiftChar(); char const *str = readInterpolation(depth + 1); if (str && str[0]) beginExpansion(str, false, str); - continue; /* Restart, reading from the new buffer */ + continue; // Restart, reading from the new buffer } else if (c == EOF || c == '\r' || c == '\n' || c == '"') { error("Missing }\n"); break; } else if (c == '}') { shiftChar(); break; - } else if (c == ':' && !fmt_IsFinished(&fmt)) { /* Format spec, only once */ + } else if (c == ':' && !fmt_IsFinished(&fmt)) { // Format spec, only once shiftChar(); for (size_t j = 0; j < i; j++) fmt_UseCharacter(&fmt, symName[j]); @@ -1375,10 +1353,10 @@ static char const *readInterpolation(size_t depth) symName[i] = '\0'; if (!fmt_IsValid(&fmt)) error("Invalid format spec '%s'\n", symName); - i = 0; /* Now that format has been set, restart at beginning of string */ + i = 0; // Now that format has been set, restart at beginning of string } else { shiftChar(); - if (i < sizeof(symName)) /* Allow writing an extra char to flag overflow */ + if (i < sizeof(symName)) // Allow writing an extra char to flag overflow symName[i++] = c; } } @@ -1389,7 +1367,7 @@ static char const *readInterpolation(size_t depth) } symName[i] = '\0'; - /* Don't return before `lexerState->disableInterpolation` is reset! */ + // Don't return before `lexerState->disableInterpolation` is reset! lexerState->disableInterpolation = disableInterpolation; static char buf[MAXSTRLEN + 1]; @@ -1400,13 +1378,13 @@ static char const *readInterpolation(size_t depth) error("Interpolated symbol \"%s\" does not exist\n", symName); } else if (sym->type == SYM_EQUS) { if (fmt_IsEmpty(&fmt)) - /* No format was specified */ + // No format was specified fmt.type = 's'; fmt_PrintString(buf, sizeof(buf), &fmt, sym_GetStringValue(sym)); return buf; } else if (sym_IsNumeric(sym)) { if (fmt_IsEmpty(&fmt)) { - /* No format was specified; default to uppercase $hex */ + // No format was specified; default to uppercase $hex fmt.type = 'X'; fmt.prefix = true; } @@ -1426,11 +1404,11 @@ static char const *readInterpolation(size_t depth) static size_t appendEscapedSubstring(char const *str, size_t i) { - /* Copy one extra to flag overflow */ + // Copy one extra to flag overflow while (*str) { char c = *str++; - /* Escape characters that need escaping */ + // Escape characters that need escaping switch (c) { case '\\': case '"': @@ -1493,7 +1471,7 @@ static void readString(void) // Handle '\r' or '\n' (in multiline strings only, already handled above otherwise) if (c == '\r' || c == '\n') { - /* Handle CRLF before nextLine() since shiftChar updates colNo */ + // Handle CRLF before nextLine() since shiftChar updates colNo handleCRLF(c); nextLine(); c = '\n'; @@ -1645,7 +1623,7 @@ static size_t appendStringLiteral(size_t i) // Handle '\r' or '\n' (in multiline strings only, already handled above otherwise) if (c == '\r' || c == '\n') { - /* Handle CRLF before nextLine() since shiftChar updates colNo */ + // Handle CRLF before nextLine() since shiftChar updates colNo handleCRLF(c); nextLine(); c = '\n'; @@ -1715,7 +1693,7 @@ static size_t appendStringLiteral(size_t i) c = '\\'; break; - case ',': /* `\,` inside a macro arg string literal */ + case ',': // `\,` inside a macro arg string literal warning(WARNING_OBSOLETE, "`\\,` is deprecated inside strings\n"); shiftChar(); @@ -1757,7 +1735,7 @@ finish: return i; } -/* Lexer core */ +// Lexer core static int yylex_SKIP_TO_ENDC(void); // forward declaration for yylex_NORMAL @@ -1768,16 +1746,16 @@ static int yylex_NORMAL(void) char secondChar; switch (c) { - /* Ignore whitespace and comments */ + // Ignore whitespace and comments case ';': discardComment(); - /* fallthrough */ + // fallthrough case ' ': case '\t': break; - /* Handle unambiguous single-char tokens */ + // Handle unambiguous single-char tokens case '~': return T_OP_NOT; @@ -1798,23 +1776,23 @@ static int yylex_NORMAL(void) case ',': return T_COMMA; - /* Handle ambiguous 1- or 2-char tokens */ + // Handle ambiguous 1- or 2-char tokens - case '+': /* Either += or ADD */ + case '+': // Either += or ADD if (peek() == '=') { shiftChar(); return T_POP_ADDEQ; } return T_OP_ADD; - case '-': /* Either -= or SUB */ + case '-': // Either -= or SUB if (peek() == '=') { shiftChar(); return T_POP_SUBEQ; } return T_OP_SUB; - case '*': /* Either *=, MUL, or EXP */ + case '*': // Either *=, MUL, or EXP switch (peek()) { case '=': shiftChar(); @@ -1826,7 +1804,7 @@ static int yylex_NORMAL(void) return T_OP_MUL; } - case '/': /* Either /=, DIV, or a block comment */ + case '/': // Either /=, DIV, or a block comment switch (peek()) { case '=': shiftChar(); @@ -1840,7 +1818,7 @@ static int yylex_NORMAL(void) } break; - case '|': /* Either |=, binary OR, or logical OR */ + case '|': // Either |=, binary OR, or logical OR switch (peek()) { case '=': shiftChar(); @@ -1852,30 +1830,30 @@ static int yylex_NORMAL(void) return T_OP_OR; } - case '^': /* Either ^= or XOR */ + case '^': // Either ^= or XOR if (peek() == '=') { shiftChar(); return T_POP_XOREQ; } return T_OP_XOR; - case '=': /* Either assignment or EQ */ + case '=': // Either assignment or EQ if (peek() == '=') { shiftChar(); return T_OP_LOGICEQU; } return T_POP_EQUAL; - case '!': /* Either a NEQ or negation */ + case '!': // Either a NEQ or negation if (peek() == '=') { shiftChar(); return T_OP_LOGICNE; } return T_OP_LOGICNOT; - /* Handle ambiguous 1-, 2-, or 3-char tokens */ + // Handle ambiguous 1-, 2-, or 3-char tokens - case '<': /* Either <<=, LT, LTE, or left shift */ + case '<': // Either <<=, LT, LTE, or left shift switch (peek()) { case '=': shiftChar(); @@ -1891,7 +1869,7 @@ static int yylex_NORMAL(void) return T_OP_LOGICLT; } - case '>': /* Either >>=, GT, GTE, or either kind of right shift */ + case '>': // Either >>=, GT, GTE, or either kind of right shift switch (peek()) { case '=': shiftChar(); @@ -1912,7 +1890,7 @@ static int yylex_NORMAL(void) return T_OP_LOGICGT; } - /* Handle colon, which may begin an anonymous label ref */ + // Handle colon, which may begin an anonymous label ref case ':': c = peek(); @@ -1922,9 +1900,9 @@ static int yylex_NORMAL(void) readAnonLabelRef(c); return T_ANON; - /* Handle numbers */ + // Handle numbers - case '0': /* Decimal or fixed-point number */ + case '0': // Decimal or fixed-point number case '1': case '2': case '3': @@ -1941,7 +1919,7 @@ static int yylex_NORMAL(void) } return T_NUMBER; - case '&': /* Either &=, binary AND, logical AND, or an octal constant */ + case '&': // Either &=, binary AND, logical AND, or an octal constant secondChar = peek(); if (secondChar == '=') { shiftChar(); @@ -1955,7 +1933,7 @@ static int yylex_NORMAL(void) } return T_OP_AND; - case '%': /* Either %=, MOD, or a binary constant */ + case '%': // Either %=, MOD, or a binary constant secondChar = peek(); if (secondChar == '=') { shiftChar(); @@ -1966,32 +1944,32 @@ static int yylex_NORMAL(void) } return T_OP_MOD; - case '$': /* Hex constant */ + case '$': // Hex constant yylval.constValue = readHexNumber(); return T_NUMBER; - case '`': /* Gfx constant */ + case '`': // Gfx constant yylval.constValue = readGfxConstant(); return T_NUMBER; - /* Handle strings */ + // Handle strings case '"': readString(); return T_STRING; - /* Handle newlines and EOF */ + // Handle newlines and EOF case '\r': handleCRLF(c); - /* fallthrough */ + // fallthrough case '\n': return T_NEWLINE; case EOF: return T_EOF; - /* Handle line continuations */ + // Handle line continuations case '\\': // Macro args were handled by `peek`, and character escapes do not exist @@ -1999,25 +1977,25 @@ static int yylex_NORMAL(void) readLineContinuation(); break; - /* Handle identifiers... or report garbage characters */ + // Handle identifiers... or report garbage characters default: if (startsIdentifier(c)) { int tokenType = readIdentifier(c); - /* An ELIF after a taken IF needs to not evaluate its condition */ + // An ELIF after a taken IF needs to not evaluate its condition if (tokenType == T_POP_ELIF && lexerState->lastToken == T_NEWLINE && lexer_GetIFDepth() > 0 && lexer_RanIFBlock() && !lexer_ReachedELSEBlock()) return yylex_SKIP_TO_ENDC(); - /* If a keyword, don't try to expand */ + // If a keyword, don't try to expand if (tokenType != T_ID && tokenType != T_LOCAL_ID) return tokenType; - /* Local symbols cannot be string expansions */ + // Local symbols cannot be string expansions if (tokenType == T_ID && lexerState->expandStrings) { - /* Attempt string expansion */ + // Attempt string expansion struct Symbol const *sym = sym_FindExactSymbol(yylval.symName); if (sym && sym->type == SYM_EQUS) { @@ -2026,7 +2004,7 @@ static int yylex_NORMAL(void) assert(s); if (s[0]) beginExpansion(s, false, sym->name); - continue; /* Restart, reading from the new buffer */ + continue; // Restart, reading from the new buffer } } @@ -2036,9 +2014,9 @@ static int yylex_NORMAL(void) return tokenType; } - /* Do not report weird characters when capturing, it'll be done later */ + // Do not report weird characters when capturing, it'll be done later if (!lexerState->capturing) { - /* TODO: try to group reportings */ + // TODO: try to group reportings error("Unknown character %s\n", printChar(c)); } } @@ -2048,12 +2026,12 @@ static int yylex_NORMAL(void) static int yylex_RAW(void) { - /* This is essentially a modified `appendStringLiteral` */ + // This is essentially a modified `appendStringLiteral` size_t parenDepth = 0; size_t i = 0; int c; - /* Trim left whitespace (stops at a block comment) */ + // Trim left whitespace (stops at a block comment) for (;;) { c = peek(); if (isWhitespace(c)) { @@ -2075,55 +2053,55 @@ static int yylex_RAW(void) c = peek(); switch (c) { - case '"': /* String literals inside macro args */ + case '"': // String literals inside macro args shiftChar(); i = appendStringLiteral(i); break; - case ';': /* Comments inside macro args */ + case ';': // Comments inside macro args discardComment(); c = peek(); - /* fallthrough */ - case '\r': /* End of line */ + // fallthrough + case '\r': // End of line case '\n': case EOF: goto finish; - case '/': /* Block comments inside macro args */ + case '/': // Block comments inside macro args shiftChar(); if (peek() == '*') { shiftChar(); discardBlockComment(); continue; } - append_yylval_string(c); /* Append the slash */ + append_yylval_string(c); // Append the slash break; - case ',': /* End of macro arg */ + case ',': // End of macro arg if (parenDepth == 0) goto finish; goto append; - case '(': /* Open parentheses inside macro args */ + case '(': // Open parentheses inside macro args if (parenDepth < UINT_MAX) parenDepth++; goto append; - case ')': /* Close parentheses inside macro args */ + case ')': // Close parentheses inside macro args if (parenDepth > 0) parenDepth--; goto append; - case '\\': /* Character escape */ + case '\\': // Character escape shiftChar(); c = peek(); backslash: switch (c) { - case ',': /* Escapes only valid inside a macro arg */ + case ',': // Escapes only valid inside a macro arg case '(': case ')': - case '\\': /* Escapes shared with string literals */ + case '\\': // Escapes shared with string literals case '"': case '{': case '}': @@ -2145,23 +2123,21 @@ backslash: readLineContinuation(); continue; - case EOF: /* Can't really print that one */ + case EOF: // Can't really print that one error("Illegal character escape at end of input\n"); c = '\\'; break; - /* - * Macro args were already handled by peek, so '\@', - * '\#', and '\0'-'\9' should not occur here. - */ + // Macro args were already handled by peek, so '\@', + // '\#', and '\0'-'\9' should not occur here. default: error("Illegal character escape %s\n", printChar(c)); break; } - /* fallthrough */ + // fallthrough - default: /* Regular characters will just get copied */ + default: // Regular characters will just get copied append: append_yylval_string(c); shiftChar(); @@ -2174,7 +2150,7 @@ finish: i--; warning(WARNING_LONG_STR, "Macro argument too long\n"); } - /* Trim right whitespace */ + // Trim right whitespace while (i && isWhitespace(yylval.string[i - 1])) i--; yylval.string[i] = '\0'; @@ -2209,13 +2185,11 @@ finish: #undef append_yylval_string -/* - * This function uses the fact that `if`, etc. constructs are only valid when - * there's nothing before them on their lines. This enables filtering - * "meaningful" (= at line start) vs. "meaningless" (everything else) tokens. - * It's especially important due to macro args not being handled in this - * state, and lexing them in "normal" mode potentially producing such tokens. - */ +// This function uses the fact that `if`, etc. constructs are only valid when +// there's nothing before them on their lines. This enables filtering +// "meaningful" (= at line start) vs. "meaningless" (everything else) tokens. +// It's especially important due to macro args not being handled in this +// state, and lexing them in "normal" mode potentially producing such tokens. static int skipIfBlock(bool toEndc) { lexer_SetMode(LEXER_NORMAL); @@ -2223,7 +2197,7 @@ static int skipIfBlock(bool toEndc) int token; bool atLineStart = lexerState->atLineStart; - /* Prevent expanding macro args and symbol interpolation in this state */ + // Prevent expanding macro args and symbol interpolation in this state lexerState->disableMacroArgs = true; lexerState->disableInterpolation = true; @@ -2254,11 +2228,11 @@ static int skipIfBlock(bool toEndc) if (lexer_ReachedELSEBlock()) fatalerror("Found ELSE after an ELSE block\n"); lexer_ReachELSEBlock(); - /* fallthrough */ + // fallthrough maybeFinish: - if (toEndc) /* Ignore ELIF and ELSE, go to ENDC */ + if (toEndc) // Ignore ELIF and ELSE, go to ENDC break; - /* fallthrough */ + // fallthrough case T_POP_ENDC: if (lexer_GetIFDepth() == startingDepth) goto finish; @@ -2269,7 +2243,7 @@ static int skipIfBlock(bool toEndc) atLineStart = false; } - /* Read chars until EOL */ + // Read chars until EOL do { int c = nextChar(); @@ -2277,16 +2251,16 @@ static int skipIfBlock(bool toEndc) token = T_EOF; goto finish; } else if (c == '\\') { - /* Unconditionally skip the next char, including line conts */ + // Unconditionally skip the next char, including line conts c = nextChar(); } else if (c == '\r' || c == '\n') { atLineStart = true; } if (c == '\r' || c == '\n') { - /* Handle CRLF before nextLine() since shiftChar updates colNo */ + // Handle CRLF before nextLine() since shiftChar updates colNo handleCRLF(c); - /* Do this both on line continuations and plain EOLs */ + // Do this both on line continuations and plain EOLs nextLine(); } } while (!atLineStart); @@ -2316,7 +2290,7 @@ static int yylex_SKIP_TO_ENDR(void) int depth = 1; bool atLineStart = lexerState->atLineStart; - /* Prevent expanding macro args and symbol interpolation in this state */ + // Prevent expanding macro args and symbol interpolation in this state lexerState->disableMacroArgs = true; lexerState->disableInterpolation = true; @@ -2356,23 +2330,23 @@ static int yylex_SKIP_TO_ENDR(void) atLineStart = false; } - /* Read chars until EOL */ + // Read chars until EOL do { int c = nextChar(); if (c == EOF) { goto finish; } else if (c == '\\') { - /* Unconditionally skip the next char, including line conts */ + // Unconditionally skip the next char, including line conts c = nextChar(); } else if (c == '\r' || c == '\n') { atLineStart = true; } if (c == '\r' || c == '\n') { - /* Handle CRLF before nextLine() since shiftChar updates colNo */ + // Handle CRLF before nextLine() since shiftChar updates colNo handleCRLF(c); - /* Do this both on line continuations and plain EOLs */ + // Do this both on line continuations and plain EOLs nextLine(); } } while (!atLineStart); @@ -2383,7 +2357,7 @@ finish: lexerState->disableInterpolation = false; lexerState->atLineStart = false; - /* yywrap() will finish the REPT/FOR loop */ + // yywrap() will finish the REPT/FOR loop return T_EOF; } @@ -2393,10 +2367,10 @@ int yylex(void) lexer_SetState(lexerStateEOL); lexerStateEOL = NULL; } - /* `lexer_SetState` updates `lexerState`, so check for EOF after it */ + // `lexer_SetState` updates `lexerState`, so check for EOF after it if (lexerState->lastToken == T_EOB && yywrap()) return T_EOF; - /* Newlines read within an expansion should not increase the line count */ + // Newlines read within an expansion should not increase the line count if (lexerState->atLineStart && !lexerState->expansions) nextLine(); @@ -2409,7 +2383,7 @@ int yylex(void) }; int token = lexerModeFuncs[lexerState->mode](); - /* Captures end at their buffer's boundary no matter what */ + // Captures end at their buffer's boundary no matter what if (token == T_EOF && !lexerState->capturing) token = T_EOB; lexerState->lastToken = token; @@ -2431,7 +2405,7 @@ static void startCapture(struct CaptureBody *capture) if (lexerState->isMmapped && !lexerState->expansions) { capture->body = &lexerState->ptr[lexerState->offset]; } else { - lexerState->captureCapacity = 128; /* The initial size will be twice that */ + lexerState->captureCapacity = 128; // The initial size will be twice that assert(lexerState->captureBuf == NULL); reallocCaptureBuf(); capture->body = NULL; // Indicate to retrieve the capture buffer when done capturing @@ -2459,33 +2433,29 @@ bool lexer_CaptureRept(struct CaptureBody *capture) size_t depth = 0; int c = EOF; - /* - * Due to parser internals, it reads the EOL after the expression before calling this. - * Thus, we don't need to keep one in the buffer afterwards. - * The following assertion checks that. - */ + // Due to parser internals, it reads the EOL after the expression before calling this. + // Thus, we don't need to keep one in the buffer afterwards. + // The following assertion checks that. assert(lexerState->atLineStart); for (;;) { nextLine(); - /* We're at line start, so attempt to match a `REPT` or `ENDR` token */ - do { /* Discard initial whitespace */ + // We're at line start, so attempt to match a `REPT` or `ENDR` token + do { // Discard initial whitespace c = nextChar(); } while (isWhitespace(c)); - /* Now, try to match `REPT`, `FOR` or `ENDR` as a **whole** identifier */ + // Now, try to match `REPT`, `FOR` or `ENDR` as a **whole** identifier if (startsIdentifier(c)) { switch (readIdentifier(c)) { case T_POP_REPT: case T_POP_FOR: depth++; - /* Ignore the rest of that line */ + // Ignore the rest of that line break; case T_POP_ENDR: if (!depth) { - /* - * The final ENDR has been captured, but we don't want it! - * We know we have read exactly "ENDR", not e.g. an EQUS - */ + // The final ENDR has been captured, but we don't want it! + // We know we have read exactly "ENDR", not e.g. an EQUS lexerState->captureSize -= strlen("ENDR"); goto finish; } @@ -2493,7 +2463,7 @@ bool lexer_CaptureRept(struct CaptureBody *capture) } } - /* Just consume characters until EOL or EOF */ + // Just consume characters until EOL or EOF for (;; c = nextChar()) { if (c == EOF) { error("Unterminated REPT/FOR block\n"); @@ -2507,10 +2477,10 @@ bool lexer_CaptureRept(struct CaptureBody *capture) finish: endCapture(capture); - /* ENDR or EOF puts us past the start of the line */ + // ENDR or EOF puts us past the start of the line lexerState->atLineStart = false; - /* Returns true if an ENDR terminated the block, false if it reached EOF first */ + // Returns true if an ENDR terminated the block, false if it reached EOF first return c != EOF; } @@ -2518,38 +2488,34 @@ bool lexer_CaptureMacroBody(struct CaptureBody *capture) { startCapture(capture); - /* If the file is `mmap`ed, we need not to unmap it to keep access to the macro */ + // If the file is `mmap`ed, we need not to unmap it to keep access to the macro if (lexerState->isMmapped) lexerState->isReferenced = true; int c = EOF; - /* - * Due to parser internals, it reads the EOL after the expression before calling this. - * Thus, we don't need to keep one in the buffer afterwards. - * The following assertion checks that. - */ + // Due to parser internals, it reads the EOL after the expression before calling this. + // Thus, we don't need to keep one in the buffer afterwards. + // The following assertion checks that. assert(lexerState->atLineStart); for (;;) { nextLine(); - /* We're at line start, so attempt to match an `ENDM` token */ - do { /* Discard initial whitespace */ + // We're at line start, so attempt to match an `ENDM` token + do { // Discard initial whitespace c = nextChar(); } while (isWhitespace(c)); - /* Now, try to match `ENDM` as a **whole** identifier */ + // Now, try to match `ENDM` as a **whole** identifier if (startsIdentifier(c)) { switch (readIdentifier(c)) { case T_POP_ENDM: - /* - * The ENDM has been captured, but we don't want it! - * We know we have read exactly "ENDM", not e.g. an EQUS - */ + // The ENDM has been captured, but we don't want it! + // We know we have read exactly "ENDM", not e.g. an EQUS lexerState->captureSize -= strlen("ENDM"); goto finish; } } - /* Just consume characters until EOL or EOF */ + // Just consume characters until EOL or EOF for (;; c = nextChar()) { if (c == EOF) { error("Unterminated macro definition\n"); @@ -2563,9 +2529,9 @@ bool lexer_CaptureMacroBody(struct CaptureBody *capture) finish: endCapture(capture); - /* ENDM or EOF puts us past the start of the line */ + // ENDM or EOF puts us past the start of the line lexerState->atLineStart = false; - /* Returns true if an ENDM terminated the block, false if it reached EOF first */ + // Returns true if an ENDM terminated the block, false if it reached EOF first return c != EOF; } diff --git a/src/asm/macro.c b/src/asm/macro.c index d8f03695..2e500028 100644 --- a/src/asm/macro.c +++ b/src/asm/macro.c @@ -1,3 +1,10 @@ +/* + * This file is part of RGBDS. + * + * Copyright (c) 2022, Eldred Habert and RGBDS contributors. + * + * SPDX-License-Identifier: MIT + */ #include #include @@ -12,13 +19,11 @@ #define MAXMACROARGS 99999 -/* - * Your average macro invocation does not go past the tens, but some go further - * This ensures that sane and slightly insane invocations suffer no penalties, - * and the rest is insane and thus will assume responsibility. - * Additionally, ~300 bytes (on x64) of memory per level of nesting has been - * deemed reasonable. (Halve that on x86.) - */ +// Your average macro invocation does not go past the tens, but some go further +// This ensures that sane and slightly insane invocations suffer no penalties, +// and the rest is insane and thus will assume responsibility. +// Additionally, ~300 bytes (on x64) of memory per level of nesting has been +// deemed reasonable. (Halve that on x86.) #define INITIAL_ARG_SIZE 32 struct MacroArgs { unsigned int nbArgs; @@ -33,11 +38,9 @@ struct MacroArgs { static struct MacroArgs *macroArgs = NULL; static uint32_t uniqueID = 0; static uint32_t maxUniqueID = 0; -/* - * The initialization is somewhat harmful, since it is never used, but it - * guarantees the size of the buffer will be correct. I was unable to find a - * better solution, but if you have one, please feel free! - */ +// The initialization is somewhat harmful, since it is never used, but it +// guarantees the size of the buffer will be correct. I was unable to find a +// better solution, but if you have one, please feel free! static char uniqueIDBuf[] = "_u4294967295"; // UINT32_MAX static char *uniqueIDPtr = NULL; @@ -68,7 +71,7 @@ void macro_AppendArg(struct MacroArgs **argPtr, char *s) error("A maximum of " EXPAND_AND_STR(MAXMACROARGS) " arguments is allowed\n"); if (macArgs->nbArgs >= macArgs->capacity) { macArgs->capacity *= 2; - /* Check that overflow didn't roll us back */ + // Check that overflow didn't roll us back if (macArgs->capacity <= macArgs->nbArgs) fatalerror("Failed to add new macro argument: capacity overflow\n"); macArgs = realloc(macArgs, SIZEOF_ARGS(macArgs->capacity)); @@ -112,9 +115,9 @@ char const *macro_GetAllArgs(void) size_t len = 0; for (uint32_t i = macroArgs->shift; i < macroArgs->nbArgs; i++) - len += strlen(macroArgs->args[i]) + 1; /* 1 for comma */ + len += strlen(macroArgs->args[i]) + 1; // 1 for comma - char *str = malloc(len + 1); /* 1 for '\0' */ + char *str = malloc(len + 1); // 1 for '\0' char *ptr = str; if (!str) @@ -126,9 +129,9 @@ char const *macro_GetAllArgs(void) memcpy(ptr, macroArgs->args[i], n); ptr += n; - /* Commas go between args and after a last empty arg */ + // Commas go between args and after a last empty arg if (i < macroArgs->nbArgs - 1 || n == 0) - *ptr++ = ','; /* no space after comma */ + *ptr++ = ','; // no space after comma } *ptr = '\0'; @@ -153,8 +156,8 @@ void macro_SetUniqueID(uint32_t id) } else { if (uniqueID > maxUniqueID) maxUniqueID = uniqueID; - /* The buffer is guaranteed to be the correct size */ - /* This is a valid label fragment, but not a valid numeric */ + // The buffer is guaranteed to be the correct size + // This is a valid label fragment, but not a valid numeric sprintf(uniqueIDBuf, "_u%" PRIu32, id); uniqueIDPtr = uniqueIDBuf; } diff --git a/src/asm/main.c b/src/asm/main.c index 8091a544..0a06f6df 100644 --- a/src/asm/main.c +++ b/src/asm/main.c @@ -39,8 +39,8 @@ #ifdef __clang__ #if __has_feature(address_sanitizer) && !defined(__SANITIZE_ADDRESS__) #define __SANITIZE_ADDRESS__ -#endif /* __has_feature(address_sanitizer) && !defined(__SANITIZE_ADDRESS__) */ -#endif /* __clang__ */ +#endif // __has_feature(address_sanitizer) && !defined(__SANITIZE_ADDRESS__) +#endif // __clang__ #ifdef __SANITIZE_ADDRESS__ // There are known, non-trivial to fix leaks. We would still like to have `make develop' @@ -63,9 +63,9 @@ bool warnOnHaltNop; bool optimizeLoads; bool warnOnLdOpt; bool verbose; -bool warnings; /* True to enable warnings, false to disable them. */ +bool warnings; // True to enable warnings, false to disable them. -/* Escapes Make-special chars from a string */ +// Escapes Make-special chars from a string static char *make_escape(char const *str) { char * const escaped_str = malloc(strlen(str) * 2 + 1); @@ -75,7 +75,7 @@ static char *make_escape(char const *str) err("%s: Failed to allocate memory", __func__); while (*str) { - /* All dollars needs to be doubled */ + // All dollars needs to be doubled if (*str == '$') *dest++ = '$'; *dest++ = *str++; @@ -85,22 +85,20 @@ static char *make_escape(char const *str) return escaped_str; } -/* Short options */ +// Short options static const char *optstring = "b:D:Eg:Hhi:LlM:o:p:r:VvW:w"; -/* Variables for the long-only options */ -static int depType; /* Variants of `-M` */ +// Variables for the long-only options +static int depType; // Variants of `-M` -/* - * Equivalent long options - * Please keep in the same order as short opts - * - * Also, make sure long opts don't create ambiguity: - * A long opt's name should start with the same letter as its short opt, - * except if it doesn't create any ambiguity (`verbose` versus `version`). - * This is because long opt matching, even to a single char, is prioritized - * over short opt matching - */ +// Equivalent long options +// Please keep in the same order as short opts +// +// Also, make sure long opts don't create ambiguity: +// A long opt's name should start with the same letter as its short opt, +// except if it doesn't create any ambiguity (`verbose` versus `version`). +// This is because long opt matching, even to a single char, is prioritized +// over short opt matching static struct option const longopts[] = { { "binary-digits", required_argument, NULL, 'b' }, { "define", required_argument, NULL, 'D' }, @@ -152,10 +150,8 @@ int main(int argc, char *argv[]) time_t now = time(NULL); char const *sourceDateEpoch = getenv("SOURCE_DATE_EPOCH"); - /* - * Support SOURCE_DATE_EPOCH for reproducible builds - * https://reproducible-builds.org/docs/source-date-epoch/ - */ + // Support SOURCE_DATE_EPOCH for reproducible builds + // https://reproducible-builds.org/docs/source-date-epoch/ if (sourceDateEpoch) now = (time_t)strtoul(sourceDateEpoch, NULL, 0); @@ -289,7 +285,7 @@ int main(int argc, char *argv[]) warnings = false; break; - /* Long-only options */ + // Long-only options case 0: switch (depType) { case 'G': @@ -321,10 +317,10 @@ int main(int argc, char *argv[]) } break; - /* Unrecognized options */ + // Unrecognized options default: print_usage(); - /* NOTREACHED */ + // NOTREACHED } } @@ -376,7 +372,7 @@ int main(int argc, char *argv[]) if (failedOnMissingInclude) return 0; - /* If no path specified, don't write file */ + // If no path specified, don't write file if (objectName != NULL) out_WriteObject(); return 0; diff --git a/src/asm/opt.c b/src/asm/opt.c index 4d3c7b71..c5e32a2f 100644 --- a/src/asm/opt.c +++ b/src/asm/opt.c @@ -1,3 +1,11 @@ +/* + * This file is part of RGBDS. + * + * Copyright (c) 2022, RGBDS contributors. + * + * SPDX-License-Identifier: MIT + */ + #include #include #include diff --git a/src/asm/output.c b/src/asm/output.c index 4ee9150b..888be27f 100644 --- a/src/asm/output.c +++ b/src/asm/output.c @@ -6,9 +6,7 @@ * SPDX-License-Identifier: MIT */ -/* - * Outputs an objectfile - */ +// Outputs an objectfile #include #include @@ -54,18 +52,16 @@ char *objectName; struct Section *sectionList; -/* Linked list of symbols to put in the object file */ +// Linked list of symbols to put in the object file static struct Symbol *objectSymbols = NULL; static struct Symbol **objectSymbolsTail = &objectSymbols; -static uint32_t nbSymbols = 0; /* Length of the above list */ +static uint32_t nbSymbols = 0; // Length of the above list static struct Assertion *assertions = NULL; static struct FileStackNode *fileStackNodes = NULL; -/* - * Count the number of sections used in this object - */ +// Count the number of sections used in this object static uint32_t countSections(void) { uint32_t count = 0; @@ -76,9 +72,7 @@ static uint32_t countSections(void) return count; } -/* - * Count the number of patches used in this object - */ +// Count the number of patches used in this object static uint32_t countPatches(struct Section const *sect) { uint32_t r = 0; @@ -90,9 +84,7 @@ static uint32_t countPatches(struct Section const *sect) return r; } -/** - * Count the number of assertions used in this object - */ +// Count the number of assertions used in this object static uint32_t countAsserts(void) { struct Assertion *assert = assertions; @@ -105,9 +97,7 @@ static uint32_t countAsserts(void) return count; } -/* - * Write a long to a file (little-endian) - */ +// Write a long to a file (little-endian) static void putlong(uint32_t i, FILE *f) { putc(i, f); @@ -116,9 +106,7 @@ static void putlong(uint32_t i, FILE *f) putc(i >> 24, f); } -/* - * Write a NULL-terminated string to a file - */ +// Write a NULL-terminated string to a file static void putstring(char const *s, FILE *f) { while (*s) @@ -133,7 +121,7 @@ static uint32_t getNbFileStackNodes(void) void out_RegisterNode(struct FileStackNode *node) { - /* If node is not already registered, register it (and parents), and give it a unique ID */ + // If node is not already registered, register it (and parents), and give it a unique ID while (node->ID == (uint32_t)-1) { node->ID = getNbFileStackNodes(); if (node->ID == (uint32_t)-1) @@ -141,7 +129,7 @@ void out_RegisterNode(struct FileStackNode *node) node->next = fileStackNodes; fileStackNodes = node; - /* Also register the node's parents */ + // Also register the node's parents node = node->parent; if (!node) break; @@ -156,25 +144,21 @@ This is code intended to replace a node, which is pretty useless until ref count struct FileStackNode **ptr = &fileStackNodes; - /* - * The linked list is supposed to have decrementing IDs, so iterate with less memory reads, - * to hopefully hit the cache less. A debug check is added after, in case a change is made - * that breaks this assumption. - */ + // The linked list is supposed to have decrementing IDs, so iterate with less memory reads, + // to hopefully hit the cache less. A debug check is added after, in case a change is made + // that breaks this assumption. for (uint32_t i = fileStackNodes->ID; i != node->ID; i--) ptr = &(*ptr)->next; assert((*ptr)->ID == node->ID); node->next = (*ptr)->next; - assert(!node->next || node->next->ID == node->ID - 1); /* Catch inconsistencies early */ - /* TODO: unreference the node */ + assert(!node->next || node->next->ID == node->ID - 1); // Catch inconsistencies early + // TODO: unreference the node *ptr = node; #endif } -/* - * Return a section's ID - */ +// Return a section's ID static uint32_t getsectid(struct Section const *sect) { struct Section const *sec = sectionList; @@ -195,9 +179,7 @@ static uint32_t getSectIDIfAny(struct Section const *sect) return sect ? getsectid(sect) : (uint32_t)-1; } -/* - * Write a patch to a file - */ +// Write a patch to a file static void writepatch(struct Patch const *patch, FILE *f) { assert(patch->src->ID != (uint32_t)-1); @@ -211,9 +193,7 @@ static void writepatch(struct Patch const *patch, FILE *f) fwrite(patch->rpn, 1, patch->rpnSize, f); } -/* - * Write a section to a file - */ +// Write a section to a file static void writesection(struct Section const *sect, FILE *f) { putstring(sect->name, f); @@ -255,9 +235,7 @@ static void freesection(struct Section const *sect) } } -/* - * Write a symbol to a file - */ +// Write a symbol to a file static void writesymbol(struct Symbol const *sym, FILE *f) { putstring(sym->name, f); @@ -285,10 +263,8 @@ static void registerSymbol(struct Symbol *sym) sym->ID = nbSymbols++; } -/* - * Returns a symbol's ID within the object file - * If the symbol does not have one, one is assigned by registering the symbol - */ +// Returns a symbol's ID within the object file +// If the symbol does not have one, one is assigned by registering the symbol static uint32_t getSymbolID(struct Symbol *sym) { if (sym->ID == (uint32_t)-1 && !sym_IsPC(sym)) @@ -392,10 +368,8 @@ static void writerpn(uint8_t *rpnexpr, uint32_t *rpnptr, uint8_t *rpn, } } -/* - * Allocate a new patch structure and link it into the list - * WARNING: all patches are assumed to eventually be written, so the file stack node is registered - */ +// Allocate a new patch structure and link it into the list +// WARNING: all patches are assumed to eventually be written, so the file stack node is registered static struct Patch *allocpatch(uint32_t type, struct Expression const *expr, uint32_t ofs) { struct Patch *patch = malloc(sizeof(struct Patch)); @@ -417,10 +391,10 @@ static struct Patch *allocpatch(uint32_t type, struct Expression const *expr, ui patch->pcSection = sect_GetSymbolSection(); patch->pcOffset = sect_GetSymbolOffset(); - /* If the rpnSize's value is known, output a constant RPN rpnSize directly */ + // If the rpnSize's value is known, output a constant RPN rpnSize directly if (expr->isKnown) { patch->rpnSize = rpnSize; - /* Make sure to update `rpnSize` above if modifying this! */ + // Make sure to update `rpnSize` above if modifying this! patch->rpn[0] = RPN_CONST; patch->rpn[1] = (uint32_t)(expr->val) & 0xFF; patch->rpn[2] = (uint32_t)(expr->val) >> 8; @@ -435,9 +409,7 @@ static struct Patch *allocpatch(uint32_t type, struct Expression const *expr, ui return patch; } -/* - * Create a new patch (includes the rpn expr) - */ +// Create a new patch (includes the rpn expr) void out_CreatePatch(uint32_t type, struct Expression const *expr, uint32_t ofs, uint32_t pcShift) { struct Patch *patch = allocpatch(type, expr, ofs); @@ -451,9 +423,7 @@ void out_CreatePatch(uint32_t type, struct Expression const *expr, uint32_t ofs, currentSection->patches = patch; } -/** - * Creates an assert that will be written to the object file - */ +// Creates an assert that will be written to the object file bool out_CreateAssert(enum AssertionType type, struct Expression const *expr, char const *message, uint32_t ofs) { @@ -499,7 +469,7 @@ static void writeFileStackNode(struct FileStackNode const *node, FILE *f) struct FileStackReptNode const *reptNode = (struct FileStackReptNode const *)node; putlong(reptNode->reptDepth, f); - /* Iters are stored by decreasing depth, so reverse the order for output */ + // Iters are stored by decreasing depth, so reverse the order for output for (uint32_t i = reptNode->reptDepth; i--; ) putlong(reptNode->iters[i], f); } @@ -515,9 +485,7 @@ static void registerUnregisteredSymbol(struct Symbol *symbol, void *arg) } } -/* - * Write an objectfile - */ +// Write an objectfile void out_WriteObject(void) { FILE *f; @@ -529,7 +497,7 @@ void out_WriteObject(void) if (!f) err("Couldn't write file '%s'", objectName); - /* Also write symbols that weren't written above */ + // Also write symbols that weren't written above sym_ForEach(registerUnregisteredSymbol, NULL); fprintf(f, RGBDS_OBJECT_VERSION_STRING); @@ -569,9 +537,7 @@ void out_WriteObject(void) fclose(f); } -/* - * Set the objectfilename - */ +// Set the objectfilename void out_SetFileName(char *s) { objectName = s; diff --git a/src/asm/parser.y b/src/asm/parser.y index d5b2ff0e..3836bb15 100644 --- a/src/asm/parser.y +++ b/src/asm/parser.y @@ -36,7 +36,7 @@ #include "linkdefs.h" #include "platform.h" // strncasecmp, strdup -static struct CaptureBody captureBody; /* Captures a REPT/FOR or MACRO */ +static struct CaptureBody captureBody; // Captures a REPT/FOR or MACRO static void upperstring(char *dest, char const *src) { @@ -104,14 +104,14 @@ static size_t strlenUTF8(char const *s) case 1: errorInvalidUTF8Byte(byte, "STRLEN"); state = 0; - /* fallthrough */ + // fallthrough case 0: len++; break; } } - /* Check for partial code point. */ + // Check for partial code point. if (state != 0) error("STRLEN: Incomplete UTF-8 character\n"); @@ -127,13 +127,13 @@ static void strsubUTF8(char *dest, size_t destLen, char const *src, uint32_t pos uint32_t curLen = 0; uint32_t curPos = 1; - /* Advance to starting position in source string. */ + // Advance to starting position in source string. while (src[srcIndex] && curPos < pos) { switch (decode(&state, &codep, src[srcIndex])) { case 1: errorInvalidUTF8Byte(src[srcIndex], "STRSUB"); state = 0; - /* fallthrough */ + // fallthrough case 0: curPos++; break; @@ -141,21 +141,19 @@ static void strsubUTF8(char *dest, size_t destLen, char const *src, uint32_t pos srcIndex++; } - /* - * A position 1 past the end of the string is allowed, but will trigger the - * "Length too big" warning below if the length is nonzero. - */ + // A position 1 past the end of the string is allowed, but will trigger the + // "Length too big" warning below if the length is nonzero. if (!src[srcIndex] && pos > curPos) warning(WARNING_BUILTIN_ARG, "STRSUB: Position %" PRIu32 " is past the end of the string\n", pos); - /* Copy from source to destination. */ + // Copy from source to destination. while (src[srcIndex] && destIndex < destLen - 1 && curLen < len) { switch (decode(&state, &codep, src[srcIndex])) { case 1: errorInvalidUTF8Byte(src[srcIndex], "STRSUB"); state = 0; - /* fallthrough */ + // fallthrough case 0: curLen++; break; @@ -166,7 +164,7 @@ static void strsubUTF8(char *dest, size_t destLen, char const *src, uint32_t pos if (curLen < len) warning(WARNING_BUILTIN_ARG, "STRSUB: Length too big: %" PRIu32 "\n", len); - /* Check for partial code point. */ + // Check for partial code point. if (state != 0) error("STRSUB: Incomplete UTF-8 character\n"); @@ -187,7 +185,7 @@ static void charsubUTF8(char *dest, char const *src, uint32_t pos) { size_t charLen = 1; - /* Advance to starting position in source string. */ + // Advance to starting position in source string. for (uint32_t curPos = 1; charLen && curPos < pos; curPos++) charLen = charmap_ConvertNext(&src, NULL); @@ -197,7 +195,7 @@ static void charsubUTF8(char *dest, char const *src, uint32_t pos) warning(WARNING_BUILTIN_ARG, "CHARSUB: Position %" PRIu32 " is past the end of the string\n", pos); - /* Copy from source to destination. */ + // Copy from source to destination. memcpy(dest, start, src - start); dest[src - start] = '\0'; @@ -205,10 +203,8 @@ static void charsubUTF8(char *dest, char const *src, uint32_t pos) static uint32_t adjustNegativePos(int32_t pos, size_t len, char const *functionName) { - /* - * STRSUB and CHARSUB adjust negative `pos` arguments the same way, - * such that position -1 is the last character of a string. - */ + // STRSUB and CHARSUB adjust negative `pos` arguments the same way, + // such that position -1 is the last character of a string. if (pos < 0) pos += len + 1; if (pos < 1) { @@ -545,7 +541,7 @@ enum { %left T_OP_SHL T_OP_SHR T_OP_USHR %left T_OP_MUL T_OP_DIV T_OP_MOD -%precedence NEG /* negation -- unary minus */ +%precedence NEG // negation -- unary minus %token T_OP_EXP "**" %left T_OP_EXP @@ -588,7 +584,6 @@ enum { %type scoped_id %type scoped_anon_id %token T_POP_EQU "EQU" -%token T_POP_SET "SET" %token T_POP_EQUAL "=" %token T_POP_EQUS "EQUS" @@ -642,7 +637,7 @@ enum { %type for_args %token T_Z80_ADC "adc" T_Z80_ADD "add" T_Z80_AND "and" -%token T_Z80_BIT "bit" // There is no T_Z80_SET, only T_POP_SET +%token T_Z80_BIT "bit" %token T_Z80_CALL "call" T_Z80_CCF "ccf" T_Z80_CP "cp" T_Z80_CPL "cpl" %token T_Z80_DAA "daa" T_Z80_DEC "dec" T_Z80_DI "di" %token T_Z80_EI "ei" @@ -659,7 +654,7 @@ enum { %token T_Z80_RES "res" T_Z80_RET "ret" T_Z80_RETI "reti" T_Z80_RST "rst" %token T_Z80_RL "rl" T_Z80_RLA "rla" T_Z80_RLC "rlc" T_Z80_RLCA "rlca" %token T_Z80_RR "rr" T_Z80_RRA "rra" T_Z80_RRC "rrc" T_Z80_RRCA "rrca" -%token T_Z80_SBC "sbc" T_Z80_SCF "scf" T_Z80_STOP "stop" +%token T_Z80_SBC "sbc" T_Z80_SCF "scf" T_Z80_SET "set" T_Z80_STOP "stop" %token T_Z80_SLA "sla" T_Z80_SRA "sra" T_Z80_SRL "srl" T_Z80_SUB "sub" %token T_Z80_SWAP "swap" %token T_Z80_XOR "xor" @@ -707,8 +702,8 @@ plain_directive : label ; line : plain_directive endofline - | line_directive /* Directives that manage newlines themselves */ - /* Continue parsing the next line on a syntax error */ + | line_directive // Directives that manage newlines themselves + // Continue parsing the next line on a syntax error | error { lexer_SetMode(LEXER_NORMAL); lexer_ToggleStringExpansion(true); @@ -716,7 +711,7 @@ line : plain_directive endofline fstk_StopRept(); yyerrok; } - /* Hint about unindented macros parsed as labels */ + // Hint about unindented macros parsed as labels | T_LABEL error { lexer_SetMode(LEXER_NORMAL); lexer_ToggleStringExpansion(true); @@ -731,19 +726,17 @@ line : plain_directive endofline } ; -/* - * For "logistical" reasons, these directives must manage newlines themselves. - * This is because we need to switch the lexer's mode *after* the newline has been read, - * and to avoid causing some grammar conflicts (token reducing is finicky). - * This is DEFINITELY one of the more FRAGILE parts of the codebase, handle with care. - */ +// For "logistical" reasons, these directives must manage newlines themselves. +// This is because we need to switch the lexer's mode *after* the newline has been read, +// and to avoid causing some grammar conflicts (token reducing is finicky). +// This is DEFINITELY one of the more FRAGILE parts of the codebase, handle with care. line_directive : macrodef | rept | for | break | include | if - /* It's important that all of these require being at line start for `skipIfBlock` */ + // It's important that all of these require being at line start for `skipIfBlock` | elif | else ; @@ -854,7 +847,7 @@ macroargs : %empty { } ; -/* These commands start with a T_LABEL. */ +// These commands start with a T_LABEL. assignment_directive : equ | assignment | rb @@ -1300,7 +1293,7 @@ constlist_8bit_entry : reloc_8bit_no_str { sect_RelByte(&$1, 0); } | string { - uint8_t *output = malloc(strlen($1)); /* Cannot be larger than that */ + uint8_t *output = malloc(strlen($1)); // Cannot be larger than that size_t length = charmap_Convert($1, output); sect_AbsByteGroup(output, length); @@ -1316,7 +1309,7 @@ constlist_16bit_entry : reloc_16bit_no_str { sect_RelWord(&$1, 0); } | string { - uint8_t *output = malloc(strlen($1)); /* Cannot be larger than that */ + uint8_t *output = malloc(strlen($1)); // Cannot be larger than that size_t length = charmap_Convert($1, output); sect_AbsWordGroup(output, length); @@ -1681,7 +1674,7 @@ sectattrs : %empty { $$.alignOfs = $7; } | sectattrs T_COMMA T_OP_BANK T_LBRACK uconst T_RBRACK { - /* We cannot check the validity of this now */ + // We cannot check the validity of this now $$.bank = $5; } ; @@ -1998,10 +1991,8 @@ z80_ld_ss : T_Z80_LD T_MODE_BC T_COMMA reloc_16bit { sect_AbsByte(0x01 | (REG_DE << 4)); sect_RelWord(&$4, 1); } - /* - * HL is taken care of in z80_ld_hl - * SP is taken care of in z80_ld_sp - */ + // HL is taken care of in z80_ld_hl + // SP is taken care of in z80_ld_sp ; z80_nop : T_Z80_NOP { sect_AbsByte(0x00); } @@ -2089,7 +2080,7 @@ z80_sbc : T_Z80_SBC op_a_n { z80_scf : T_Z80_SCF { sect_AbsByte(0x37); } ; -z80_set : T_POP_SET const_3bit T_COMMA reg_r { +z80_set : T_Z80_SET const_3bit T_COMMA reg_r { sect_AbsByte(0xCB); sect_AbsByte(0xC0 | ($2 << 3) | $4); } diff --git a/src/asm/rpn.c b/src/asm/rpn.c index b2fe20ae..b233ecbf 100644 --- a/src/asm/rpn.c +++ b/src/asm/rpn.c @@ -6,9 +6,7 @@ * SPDX-License-Identifier: MIT */ -/* - * Controls RPN expressions for objectfiles - */ +// Controls RPN expressions for objectfiles #include #include @@ -28,7 +26,7 @@ #include "opmath.h" -/* Makes an expression "not known", also setting its error message */ +// Makes an expression "not known", also setting its error message #define makeUnknown(expr_, ...) do { \ struct Expression *_expr = expr_; \ _expr->isKnown = false; \ @@ -47,17 +45,15 @@ static uint8_t *reserveSpace(struct Expression *expr, uint32_t size) { - /* This assumes the RPN length is always less than the capacity */ + // This assumes the RPN length is always less than the capacity if (expr->rpnCapacity - expr->rpnLength < size) { - /* If there isn't enough room to reserve the space, realloc */ + // If there isn't enough room to reserve the space, realloc if (!expr->rpn) - expr->rpnCapacity = 256; /* Initial size */ + expr->rpnCapacity = 256; // Initial size while (expr->rpnCapacity - expr->rpnLength < size) { if (expr->rpnCapacity >= MAXRPNLEN) - /* - * To avoid generating humongous object files, cap the - * size of RPN expressions - */ + // To avoid generating humongous object files, cap the + // size of RPN expressions fatalerror("RPN expression cannot grow larger than " EXPAND_AND_STR(MAXRPNLEN) " bytes\n"); else if (expr->rpnCapacity > MAXRPNLEN / 2) @@ -77,9 +73,7 @@ static uint8_t *reserveSpace(struct Expression *expr, uint32_t size) return ptr; } -/* - * Init a RPN expression - */ +// Init a RPN expression static void rpn_Init(struct Expression *expr) { expr->reason = NULL; @@ -91,9 +85,7 @@ static void rpn_Init(struct Expression *expr) expr->rpnPatchSize = 0; } -/* - * Free the RPN expression - */ +// Free the RPN expression void rpn_Free(struct Expression *expr) { free(expr->rpn); @@ -101,9 +93,7 @@ void rpn_Free(struct Expression *expr) rpn_Init(expr); } -/* - * Add symbols, constants and operators to expression - */ +// Add symbols, constants and operators to expression void rpn_Number(struct Expression *expr, uint32_t i) { rpn_Init(expr); @@ -124,9 +114,9 @@ void rpn_Symbol(struct Expression *expr, char const *symName) makeUnknown(expr, sym_IsPC(sym) ? "PC is not constant at assembly time" : "'%s' is not constant at assembly time", symName); sym = sym_Ref(symName); - expr->rpnPatchSize += 5; /* 1-byte opcode + 4-byte symbol ID */ + expr->rpnPatchSize += 5; // 1-byte opcode + 4-byte symbol ID - size_t nameLen = strlen(sym->name) + 1; /* Don't forget NUL! */ + size_t nameLen = strlen(sym->name) + 1; // Don't forget NUL! uint8_t *ptr = reserveSpace(expr, nameLen + 1); *ptr++ = RPN_SYM; memcpy(ptr, sym->name, nameLen); @@ -155,7 +145,7 @@ void rpn_BankSymbol(struct Expression *expr, char const *symName) { struct Symbol const *sym = sym_FindScopedSymbol(symName); - /* The @ symbol is treated differently. */ + // The @ symbol is treated differently. if (sym_IsPC(sym)) { rpn_BankSelf(expr); return; @@ -169,13 +159,13 @@ void rpn_BankSymbol(struct Expression *expr, char const *symName) assert(sym); // If the symbol didn't exist, it should have been created if (sym_GetSection(sym) && sym_GetSection(sym)->bank != (uint32_t)-1) { - /* Symbol's section is known and bank is fixed */ + // Symbol's section is known and bank is fixed expr->val = sym_GetSection(sym)->bank; } else { makeUnknown(expr, "\"%s\"'s bank is not known", symName); - expr->rpnPatchSize += 5; /* opcode + 4-byte sect ID */ + expr->rpnPatchSize += 5; // opcode + 4-byte sect ID - size_t nameLen = strlen(sym->name) + 1; /* Room for NUL! */ + size_t nameLen = strlen(sym->name) + 1; // Room for NUL! uint8_t *ptr = reserveSpace(expr, nameLen + 1); *ptr++ = RPN_BANK_SYM; memcpy(ptr, sym->name, nameLen); @@ -194,7 +184,7 @@ void rpn_BankSection(struct Expression *expr, char const *sectionName) } else { makeUnknown(expr, "Section \"%s\"'s bank is not known", sectionName); - size_t nameLen = strlen(sectionName) + 1; /* Room for NUL! */ + size_t nameLen = strlen(sectionName) + 1; // Room for NUL! uint8_t *ptr = reserveSpace(expr, nameLen + 1); expr->rpnPatchSize += nameLen + 1; @@ -214,7 +204,7 @@ void rpn_SizeOfSection(struct Expression *expr, char const *sectionName) } else { makeUnknown(expr, "Section \"%s\"'s size is not known", sectionName); - size_t nameLen = strlen(sectionName) + 1; /* Room for NUL! */ + size_t nameLen = strlen(sectionName) + 1; // Room for NUL! uint8_t *ptr = reserveSpace(expr, nameLen + 1); expr->rpnPatchSize += nameLen + 1; @@ -234,7 +224,7 @@ void rpn_StartOfSection(struct Expression *expr, char const *sectionName) } else { makeUnknown(expr, "Section \"%s\"'s start is not known", sectionName); - size_t nameLen = strlen(sectionName) + 1; /* Room for NUL! */ + size_t nameLen = strlen(sectionName) + 1; // Room for NUL! uint8_t *ptr = reserveSpace(expr, nameLen + 1); expr->rpnPatchSize += nameLen + 1; @@ -252,7 +242,7 @@ void rpn_CheckHRAM(struct Expression *expr, const struct Expression *src) expr->rpnPatchSize++; *reserveSpace(expr, 1) = RPN_HRAM; } else if (expr->val >= 0xFF00 && expr->val <= 0xFFFF) { - /* That range is valid, but only keep the lower byte */ + // That range is valid, but only keep the lower byte expr->val &= 0xFF; } else if (expr->val < 0 || expr->val > 0xFF) { error("Source address $%" PRIx32 " not between $FF00 to $FFFF\n", expr->val); @@ -264,10 +254,10 @@ void rpn_CheckRST(struct Expression *expr, const struct Expression *src) *expr = *src; if (rpn_isKnown(expr)) { - /* A valid RST address must be masked with 0x38 */ + // A valid RST address must be masked with 0x38 if (expr->val & ~0x38) error("Invalid address $%" PRIx32 " for RST\n", expr->val); - /* The target is in the "0x38" bits, all other bits are set */ + // The target is in the "0x38" bits, all other bits are set expr->val |= 0xC7; } else { expr->rpnPatchSize++; @@ -275,9 +265,7 @@ void rpn_CheckRST(struct Expression *expr, const struct Expression *src) } } -/* - * Checks that an RPN expression's value fits within N bits (signed or unsigned) - */ +// Checks that an RPN expression's value fits within N bits (signed or unsigned) void rpn_CheckNBit(struct Expression const *expr, uint8_t n) { assert(n != 0); // That doesn't make sense @@ -324,7 +312,7 @@ struct Symbol const *rpn_SymbolOf(struct Expression const *expr) bool rpn_IsDiffConstant(struct Expression const *src, struct Symbol const *sym) { - /* Check if both expressions only refer to a single symbol */ + // Check if both expressions only refer to a single symbol struct Symbol const *sym1 = rpn_SymbolOf(src); if (!sym1 || !sym || sym1->type != SYM_LABEL || sym->type != SYM_LABEL) @@ -341,7 +329,7 @@ static bool isDiffConstant(struct Expression const *src1, return rpn_IsDiffConstant(src1, rpn_SymbolOf(src2)); } -/** +/* * Attempts to compute a constant binary AND from non-constant operands * This is possible if one operand is a symbol belonging to an `ALIGN[N]` section, and the other is * a constant that only keeps (some of) the lower N bits. @@ -387,12 +375,12 @@ void rpn_BinaryOp(enum RPNCommand op, struct Expression *expr, expr->isSymbol = false; int32_t constMaskVal; - /* First, check if the expression is known */ + // First, check if the expression is known expr->isKnown = src1->isKnown && src2->isKnown; if (expr->isKnown) { - rpn_Init(expr); /* Init the expression to something sane */ + rpn_Init(expr); // Init the expression to something sane - /* If both expressions are known, just compute the value */ + // If both expressions are known, just compute the value uint32_t uleft = src1->val, uright = src2->val; switch (op) { @@ -537,9 +525,9 @@ void rpn_BinaryOp(enum RPNCommand op, struct Expression *expr, expr->val = constMaskVal; expr->isKnown = true; } else { - /* If it's not known, start computing the RPN expression */ + // If it's not known, start computing the RPN expression - /* Convert the left-hand expression if it's constant */ + // Convert the left-hand expression if it's constant if (src1->isKnown) { uint32_t lval = src1->val; uint8_t bytes[] = {RPN_CONST, lval, lval >> 8, @@ -551,11 +539,11 @@ void rpn_BinaryOp(enum RPNCommand op, struct Expression *expr, memcpy(reserveSpace(expr, sizeof(bytes)), bytes, sizeof(bytes)); - /* Use the other expression's un-const reason */ + // Use the other expression's un-const reason expr->reason = src2->reason; free(src1->reason); } else { - /* Otherwise just reuse its RPN buffer */ + // Otherwise just reuse its RPN buffer expr->rpnPatchSize = src1->rpnPatchSize; expr->rpn = src1->rpn; expr->rpnCapacity = src1->rpnCapacity; @@ -564,12 +552,12 @@ void rpn_BinaryOp(enum RPNCommand op, struct Expression *expr, free(src2->reason); } - /* Now, merge the right expression into the left one */ - uint8_t *ptr = src2->rpn; /* Pointer to the right RPN */ - uint32_t len = src2->rpnLength; /* Size of the right RPN */ + // Now, merge the right expression into the left one + uint8_t *ptr = src2->rpn; // Pointer to the right RPN + uint32_t len = src2->rpnLength; // Size of the right RPN uint32_t patchSize = src2->rpnPatchSize; - /* If the right expression is constant, merge a shim instead */ + // If the right expression is constant, merge a shim instead uint32_t rval = src2->val; uint8_t bytes[] = {RPN_CONST, rval, rval >> 8, rval >> 16, rval >> 24}; @@ -578,13 +566,13 @@ void rpn_BinaryOp(enum RPNCommand op, struct Expression *expr, len = sizeof(bytes); patchSize = sizeof(bytes); } - /* Copy the right RPN and append the operator */ + // Copy the right RPN and append the operator uint8_t *buf = reserveSpace(expr, len + 1); memcpy(buf, ptr, len); buf[len] = op; - free(src2->rpn); /* If there was none, this is `free(NULL)` */ + free(src2->rpn); // If there was none, this is `free(NULL)` expr->rpnPatchSize += patchSize + 1; } } diff --git a/src/asm/section.c b/src/asm/section.c index 84c6391a..d33f55cb 100644 --- a/src/asm/section.c +++ b/src/asm/section.c @@ -1,3 +1,10 @@ +/* + * This file is part of RGBDS. + * + * Copyright (c) 2022, RGBDS contributors. + * + * SPDX-License-Identifier: MIT + */ #include #include @@ -30,7 +37,7 @@ struct UnionStackEntry { struct SectionStackEntry { struct Section *section; struct Section *loadSection; - char const *scope; /* Section's symbol scope */ + char const *scope; // Section's symbol scope uint32_t offset; int32_t loadOffset; struct UnionStackEntry *unionStack; @@ -38,14 +45,12 @@ struct SectionStackEntry { }; struct SectionStackEntry *sectionStack; -uint32_t curOffset; /* Offset into the current section (see sect_GetSymbolOffset) */ +uint32_t curOffset; // Offset into the current section (see sect_GetSymbolOffset) struct Section *currentSection = NULL; static struct Section *currentLoadSection = NULL; -int32_t loadOffset; /* Offset into the LOAD section's parent (see sect_GetOutputOffset) */ +int32_t loadOffset; // Offset into the LOAD section's parent (see sect_GetOutputOffset) -/* - * A quick check to see if we have an initialized section - */ +// A quick check to see if we have an initialized section attr_(warn_unused_result) static bool checksection(void) { if (currentSection) @@ -55,10 +60,8 @@ attr_(warn_unused_result) static bool checksection(void) return false; } -/* - * A quick check to see if we have an initialized section that can contain - * this much initialized data - */ +// A quick check to see if we have an initialized section that can contain +// this much initialized data attr_(warn_unused_result) static bool checkcodesection(void) { if (!checksection()) @@ -85,17 +88,13 @@ attr_(warn_unused_result) static bool checkSectionSize(struct Section const *sec return false; } -/* - * Check if the section has grown too much. - */ +// Check if the section has grown too much. attr_(warn_unused_result) static bool reserveSpace(uint32_t delta_size) { - /* - * This check is here to trap broken code that generates sections that are too big and to - * prevent the assembler from generating huge object files or trying to allocate too much - * memory. - * A check at the linking stage is still necessary. - */ + // This check is here to trap broken code that generates sections that are too big and to + // prevent the assembler from generating huge object files or trying to allocate too much + // memory. + // A check at the linking stage is still necessary. // If the section has already overflowed, skip the check to avoid erroring out ad nauseam if (currentSection->size != UINT32_MAX @@ -133,15 +132,13 @@ static unsigned int mergeSectUnion(struct Section *sect, enum SectionType type, assert(alignment < 16); // Should be ensured by the caller unsigned int nbSectErrors = 0; - /* - * Unionized sections only need "compatible" constraints, and they end up with the strictest - * combination of both. - */ + // Unionized sections only need "compatible" constraints, and they end up with the strictest + // combination of both. if (sect_HasData(type)) fail("Cannot declare ROM sections as UNION\n"); if (org != (uint32_t)-1) { - /* If both are fixed, they must be the same */ + // If both are fixed, they must be the same if (sect->org != (uint32_t)-1 && sect->org != org) fail("Section already declared as fixed at different address $%04" PRIx32 "\n", sect->org); @@ -149,16 +146,16 @@ static unsigned int mergeSectUnion(struct Section *sect, enum SectionType type, fail("Section already declared as aligned to %u bytes (offset %" PRIu16 ")\n", 1U << sect->align, sect->alignOfs); else - /* Otherwise, just override */ + // Otherwise, just override sect->org = org; } else if (alignment != 0) { - /* Make sure any fixed address given is compatible */ + // Make sure any fixed address given is compatible if (sect->org != (uint32_t)-1) { if ((sect->org - alignOffset) & mask(alignment)) fail("Section already declared as fixed at incompatible address $%04" PRIx32 "\n", sect->org); - /* Check if alignment offsets are compatible */ + // Check if alignment offsets are compatible } else if ((alignOffset & mask(sect->align)) != (sect->alignOfs & mask(alignment))) { fail("Section already declared with incompatible %u" @@ -181,15 +178,13 @@ static unsigned int mergeFragments(struct Section *sect, enum SectionType type, assert(alignment < 16); // Should be ensured by the caller unsigned int nbSectErrors = 0; - /* - * Fragments only need "compatible" constraints, and they end up with the strictest - * combination of both. - * The merging is however performed at the *end* of the original section! - */ + // Fragments only need "compatible" constraints, and they end up with the strictest + // combination of both. + // The merging is however performed at the *end* of the original section! if (org != (uint32_t)-1) { uint16_t curOrg = org - sect->size; - /* If both are fixed, they must be the same */ + // If both are fixed, they must be the same if (sect->org != (uint32_t)-1 && sect->org != curOrg) fail("Section already declared as fixed at incompatible address $%04" PRIx32 " (cur addr = %04" PRIx32 ")\n", @@ -198,7 +193,7 @@ static unsigned int mergeFragments(struct Section *sect, enum SectionType type, fail("Section already declared as aligned to %u bytes (offset %" PRIu16 ")\n", 1U << sect->align, sect->alignOfs); else - /* Otherwise, just override */ + // Otherwise, just override sect->org = curOrg; } else if (alignment != 0) { @@ -207,12 +202,12 @@ static unsigned int mergeFragments(struct Section *sect, enum SectionType type, if (curOfs < 0) curOfs += 1U << alignment; - /* Make sure any fixed address given is compatible */ + // Make sure any fixed address given is compatible if (sect->org != (uint32_t)-1) { if ((sect->org - curOfs) & mask(alignment)) fail("Section already declared as fixed at incompatible address $%04" PRIx32 "\n", sect->org); - /* Check if alignment offsets are compatible */ + // Check if alignment offsets are compatible } else if ((curOfs & mask(sect->align)) != (sect->alignOfs & mask(alignment))) { fail("Section already declared with incompatible %u" "-byte alignment (offset %" PRIu16 ")\n", @@ -246,10 +241,10 @@ static void mergeSections(struct Section *sect, enum SectionType type, uint32_t // Common checks - /* If the section's bank is unspecified, override it */ + // If the section's bank is unspecified, override it if (sect->bank == (uint32_t)-1) sect->bank = bank; - /* If both specify a bank, it must be the same one */ + // If both specify a bank, it must be the same one else if (bank != (uint32_t)-1 && sect->bank != bank) fail("Section already declared with different bank %" PRIu32 "\n", sect->bank); @@ -270,9 +265,7 @@ static void mergeSections(struct Section *sect, enum SectionType type, uint32_t #undef fail -/* - * Create a new section, not yet in the list. - */ +// Create a new section, not yet in the list. static struct Section *createSection(char const *name, enum SectionType type, uint32_t org, uint32_t bank, uint8_t alignment, uint16_t alignOffset, enum SectionModifier mod) @@ -298,7 +291,7 @@ static struct Section *createSection(char const *name, enum SectionType type, sect->next = NULL; sect->patches = NULL; - /* It is only needed to allocate memory for ROM sections. */ + // It is only needed to allocate memory for ROM sections. if (sect_HasData(type)) { sect->data = malloc(sectionTypeInfo[type].size); if (sect->data == NULL) @@ -310,9 +303,7 @@ static struct Section *createSection(char const *name, enum SectionType type, return sect; } -/* - * Find a section by name and type. If it doesn't exist, create it. - */ +// Find a section by name and type. If it doesn't exist, create it. static struct Section *getSection(char const *name, enum SectionType type, uint32_t org, struct SectionSpec const *attrs, enum SectionModifier mod) { @@ -353,18 +344,18 @@ static struct Section *getSection(char const *name, enum SectionType type, uint3 error("Alignment must be between 0 and 16, not %u\n", alignment); alignment = 16; } - /* It doesn't make sense to have both alignment and org set */ + // It doesn't make sense to have both alignment and org set uint32_t mask = mask(alignment); if (org != (uint32_t)-1) { if ((org - alignOffset) & mask) error("Section \"%s\"'s fixed address doesn't match its alignment\n", name); - alignment = 0; /* Ignore it if it's satisfied */ + alignment = 0; // Ignore it if it's satisfied } else if (sectionTypeInfo[type].startAddr & mask) { error("Section \"%s\"'s alignment cannot be attained in %s\n", name, sectionTypeInfo[type].name); - alignment = 0; /* Ignore it if it's unattainable */ + alignment = 0; // Ignore it if it's unattainable org = 0; } else if (alignment == 16) { // Treat an alignment of 16 as being fixed at address 0 @@ -390,9 +381,7 @@ static struct Section *getSection(char const *name, enum SectionType type, uint3 return sect; } -/* - * Set the current section - */ +// Set the current section static void changeSection(void) { if (unionStack) @@ -401,9 +390,7 @@ static void changeSection(void) sym_SetCurrentSymbolScope(NULL); } -/* - * Set the current section by name and type - */ +// Set the current section by name and type void sect_NewSection(char const *name, uint32_t type, uint32_t org, struct SectionSpec const *attribs, enum SectionModifier mod) { @@ -423,9 +410,7 @@ void sect_NewSection(char const *name, uint32_t type, uint32_t org, currentSection = sect; } -/* - * Set the current section by name and type - */ +// Set the current section by name and type void sect_SetLoadSection(char const *name, uint32_t type, uint32_t org, struct SectionSpec const *attribs, enum SectionModifier mod) { @@ -478,9 +463,7 @@ struct Section *sect_GetSymbolSection(void) return currentLoadSection ? currentLoadSection : currentSection; } -/* - * The offset into the section above - */ +// The offset into the section above uint32_t sect_GetSymbolOffset(void) { return curOffset; @@ -615,9 +598,7 @@ void sect_CheckUnionClosed(void) error("Unterminated UNION construct!\n"); } -/* - * Output an absolute byte - */ +// Output an absolute byte void sect_AbsByte(uint8_t b) { if (!checkcodesection()) @@ -661,9 +642,7 @@ void sect_AbsLongGroup(uint8_t const *s, size_t length) writelong(*s++); } -/* - * Skip this many bytes - */ +// Skip this many bytes void sect_Skip(uint32_t skip, bool ds) { if (!checksection()) @@ -683,9 +662,7 @@ void sect_Skip(uint32_t skip, bool ds) } } -/* - * Output a NULL terminated string (excluding the NULL-character) - */ +// Output a NULL terminated string (excluding the NULL-character) void sect_String(char const *s) { if (!checkcodesection()) @@ -697,10 +674,8 @@ void sect_String(char const *s) writebyte(*s++); } -/* - * Output a relocatable byte. Checking will be done to see if it - * is an absolute value in disguise. - */ +// Output a relocatable byte. Checking will be done to see if it +// is an absolute value in disguise. void sect_RelByte(struct Expression *expr, uint32_t pcShift) { if (!checkcodesection()) @@ -717,10 +692,8 @@ void sect_RelByte(struct Expression *expr, uint32_t pcShift) rpn_Free(expr); } -/* - * Output several copies of a relocatable byte. Checking will be done to see if - * it is an absolute value in disguise. - */ +// Output several copies of a relocatable byte. Checking will be done to see if +// it is an absolute value in disguise. void sect_RelBytes(uint32_t n, struct Expression *exprs, size_t size) { if (!checkcodesection()) @@ -743,10 +716,8 @@ void sect_RelBytes(uint32_t n, struct Expression *exprs, size_t size) rpn_Free(&exprs[i]); } -/* - * Output a relocatable word. Checking will be done to see if - * it's an absolute value in disguise. - */ +// Output a relocatable word. Checking will be done to see if +// it's an absolute value in disguise. void sect_RelWord(struct Expression *expr, uint32_t pcShift) { if (!checkcodesection()) @@ -763,10 +734,8 @@ void sect_RelWord(struct Expression *expr, uint32_t pcShift) rpn_Free(expr); } -/* - * Output a relocatable longword. Checking will be done to see if - * is an absolute value in disguise. - */ +// Output a relocatable longword. Checking will be done to see if +// is an absolute value in disguise. void sect_RelLong(struct Expression *expr, uint32_t pcShift) { if (!checkcodesection()) @@ -783,10 +752,8 @@ void sect_RelLong(struct Expression *expr, uint32_t pcShift) rpn_Free(expr); } -/* - * Output a PC-relative relocatable byte. Checking will be done to see if it - * is an absolute value in disguise. - */ +// Output a PC-relative relocatable byte. Checking will be done to see if it +// is an absolute value in disguise. void sect_PCRelByte(struct Expression *expr, uint32_t pcShift) { if (!checkcodesection()) @@ -800,12 +767,12 @@ void sect_PCRelByte(struct Expression *expr, uint32_t pcShift) writebyte(0); } else { struct Symbol const *sym = rpn_SymbolOf(expr); - /* The offset wraps (jump from ROM to HRAM, for example) */ + // The offset wraps (jump from ROM to HRAM, for example) int16_t offset; - /* Offset is relative to the byte *after* the operand */ + // Offset is relative to the byte *after* the operand if (sym == pc) - offset = -2; /* PC as operand to `jr` is lower than reference PC by 2 */ + offset = -2; // PC as operand to `jr` is lower than reference PC by 2 else offset = sym_GetValue(sym) - (sym_GetValue(pc) + 1); @@ -820,9 +787,7 @@ void sect_PCRelByte(struct Expression *expr, uint32_t pcShift) rpn_Free(expr); } -/* - * Output a binary file - */ +// Output a binary file void sect_BinaryFile(char const *s, int32_t startPos) { if (startPos < 0) { @@ -869,7 +834,7 @@ void sect_BinaryFile(char const *s, int32_t startPos) if (errno != ESPIPE) error("Error determining size of INCBIN file '%s': %s\n", s, strerror(errno)); - /* The file isn't seekable, so we'll just skip bytes */ + // The file isn't seekable, so we'll just skip bytes while (startPos--) (void)fgetc(f); } @@ -901,7 +866,7 @@ void sect_BinaryFileSlice(char const *s, int32_t start_pos, int32_t length) if (!checkcodesection()) return; - if (length == 0) /* Don't even bother with 0-byte slices */ + if (length == 0) // Don't even bother with 0-byte slices return; if (!reserveSpace(length)) return; @@ -946,7 +911,7 @@ void sect_BinaryFileSlice(char const *s, int32_t start_pos, int32_t length) if (errno != ESPIPE) error("Error determining size of INCBIN file '%s': %s\n", s, strerror(errno)); - /* The file isn't seekable, so we'll just skip bytes */ + // The file isn't seekable, so we'll just skip bytes while (start_pos--) (void)fgetc(f); } @@ -968,9 +933,7 @@ cleanup: fclose(f); } -/* - * Section stack routines - */ +// Section stack routines void sect_PushSection(void) { struct SectionStackEntry *entry = malloc(sizeof(*entry)); diff --git a/src/asm/symbol.c b/src/asm/symbol.c index d0440706..e3d032a2 100644 --- a/src/asm/symbol.c +++ b/src/asm/symbol.c @@ -6,9 +6,7 @@ * SPDX-License-Identifier: MIT */ -/* - * Symboltable and macroargs stuff - */ +// Symboltable and macroargs stuff #include #include @@ -36,7 +34,7 @@ HashMap symbols; -static char const *labelScope; /* Current section's label scope */ +static const char *labelScope; // Current section's label scope static struct Symbol *PCSymbol; static char savedTIME[256]; static char savedDATE[256]; @@ -85,36 +83,34 @@ static int32_t Callback__LINE__(void) static char const *Callback__FILE__(void) { - /* - * FIXME: this is dangerous, and here's why this is CURRENTLY okay. It's still bad, fix it. - * There are only two call sites for this; one copies the contents directly, the other is - * EQUS expansions, which cannot straddle file boundaries. So this should be fine. - */ + // FIXME: this is dangerous, and here's why this is CURRENTLY okay. It's still bad, fix it. + // There are only two call sites for this; one copies the contents directly, the other is + // EQUS expansions, which cannot straddle file boundaries. So this should be fine. static char *buf = NULL; static size_t bufsize = 0; char const *fileName = fstk_GetFileName(); size_t j = 1; assert(fileName[0]); - /* The assertion above ensures the loop runs at least once */ + // 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 */ + // Account for the extra backslash inserted below if (fileName[i] == '"') j++; - /* Ensure there will be enough room; DO NOT PRINT ANYTHING ABOVE THIS!! */ - if (j + 2 >= bufsize) { /* Always keep room for 2 tail chars */ + // Ensure there will be enough room; DO NOT PRINT ANYTHING ABOVE THIS!! + if (j + 2 >= bufsize) { // Always keep room for 2 tail chars bufsize = bufsize ? bufsize * 2 : 64; buf = realloc(buf, bufsize); if (!buf) fatalerror("Failed to grow buffer for file name: %s\n", strerror(errno)); } - /* Escape quotes, since we're returning a string */ + // Escape quotes, since we're returning a string if (fileName[i] == '"') buf[j - 1] = '\\'; buf[j] = fileName[i]; } - /* Write everything after the loop, to ensure the buffer has been allocated */ + // Write everything after the loop, to ensure the buffer has been allocated buf[0] = '"'; buf[j++] = '"'; buf[j] = '\0'; @@ -128,16 +124,14 @@ static int32_t CallbackPC(void) return section ? section->org + sect_GetSymbolOffset() : 0; } -/* - * Get the value field of a symbol - */ +// Get the value field of a symbol int32_t sym_GetValue(struct Symbol const *sym) { if (sym_IsNumeric(sym) && sym->hasCallback) return sym->numCallback(); if (sym->type == SYM_LABEL) - /* TODO: do not use section's org directly */ + // TODO: do not use section's org directly return sym->value + sym_GetSection(sym)->org; return sym->value; @@ -153,32 +147,26 @@ static void dumpFilename(struct Symbol const *sym) fputs("", stderr); } -/* - * Set a symbol's definition filename and line - */ +// Set a symbol's definition filename and line static void setSymbolFilename(struct Symbol *sym) { sym->src = fstk_GetFileStack(); sym->fileLine = sym->src ? lexer_GetLineNo() : 0; // This is (NULL, 1) for built-ins } -/* - * Update a symbol's definition filename and line - */ +// Update a symbol's definition filename and line static void updateSymbolFilename(struct Symbol *sym) { struct FileStackNode *oldSrc = sym->src; setSymbolFilename(sym); - /* If the old node was referenced, ensure the new one is */ + // 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 of deleting it */ + // TODO: unref the old node, and use `out_ReplaceNode` instead of deleting it } -/* - * Create a new symbol by name - */ +// Create a new symbol by name static struct Symbol *createsymbol(char const *symName) { struct Symbol *sym = malloc(sizeof(*sym)); @@ -201,10 +189,8 @@ static struct Symbol *createsymbol(char const *symName) return sym; } -/* - * Creates the full name of a local symbol in a given scope, by prepending - * the name with the parent symbol's name. - */ +// Creates the full name of a local symbol in a given scope, by prepending +// the name with the parent symbol's name. static void fullSymbolName(char *output, size_t outputSize, char const *localName, char const *scopeName) { @@ -250,8 +236,8 @@ struct Symbol *sym_FindScopedSymbol(char const *symName) if (strchr(localName + 1, '.')) fatalerror("'%s' is a nonsensical reference to a nested local symbol\n", symName); - /* If auto-scoped local label, expand the name */ - if (localName == symName) { /* Meaning, the name begins with the dot */ + // If auto-scoped local label, expand the name + if (localName == symName) { // Meaning, the name begins with the dot char fullName[MAXSYMLEN + 1]; fullSymbolName(fullName, sizeof(fullName), symName, labelScope); @@ -271,9 +257,7 @@ static bool isReferenced(struct Symbol const *sym) return sym->ID != (uint32_t)-1; } -/* - * Purge a symbol - */ +// Purge a symbol void sym_Purge(char const *symName) { struct Symbol *sym = sym_FindScopedSymbol(symName); @@ -285,16 +269,14 @@ void sym_Purge(char const *symName) } else if (isReferenced(sym)) { error("Symbol \"%s\" is referenced and thus cannot be purged\n", symName); } else { - /* Do not keep a reference to the label's name after purging it */ + // Do not keep a reference to the label's name after purging it if (sym->name == labelScope) sym_SetCurrentSymbolScope(NULL); - /* - * FIXME: this leaks sym->macro for SYM_EQUS and SYM_MACRO, but this can't - * free(sym->macro) because the expansion may be purging itself. - */ + // FIXME: this leaks sym->macro for SYM_EQUS and SYM_MACRO, but this can't + // free(sym->macro) because the expansion may be purging itself. hash_RemoveElement(symbols, sym->name); - /* TODO: ideally, also unref the file stack nodes */ + // TODO: ideally, also unref the file stack nodes free(sym); } } @@ -312,9 +294,7 @@ uint32_t sym_GetPCValue(void) return 0; } -/* - * Return a constant symbol's value, assuming it's defined - */ +// Return a constant symbol's value, assuming it's defined uint32_t sym_GetConstantSymValue(struct Symbol const *sym) { if (sym == PCSymbol) @@ -327,9 +307,7 @@ uint32_t sym_GetConstantSymValue(struct Symbol const *sym) return 0; } -/* - * Return a constant symbol's value - */ +// Return a constant symbol's value uint32_t sym_GetConstantValue(char const *symName) { struct Symbol const *sym = sym_FindScopedSymbol(symName); @@ -381,9 +359,7 @@ static struct Symbol *createNonrelocSymbol(char const *symName, bool numeric) return sym; } -/* - * Add an equated symbol - */ +// Add an equated symbol struct Symbol *sym_AddEqu(char const *symName, int32_t value) { struct Symbol *sym = createNonrelocSymbol(symName, true); @@ -465,18 +441,14 @@ struct Symbol *sym_RedefString(char const *symName, char const *value) } updateSymbolFilename(sym); - /* - * FIXME: this leaks the previous sym->macro value, but this can't - * free(sym->macro) because the expansion may be redefining itself. - */ + // FIXME: this leaks the previous sym->macro value, but this can't + // free(sym->macro) because the expansion may be redefining itself. assignStringSymbol(sym, value); return sym; } -/* - * Alter a mutable symbol's value - */ +// Alter a mutable symbol's value struct Symbol *sym_AddVar(char const *symName, int32_t value) { struct Symbol *sym = sym_FindExactSymbol(symName); @@ -506,7 +478,7 @@ struct Symbol *sym_AddVar(char const *symName, int32_t value) */ static struct Symbol *addLabel(char const *symName) { - assert(symName[0] != '.'); /* The symbol name must have been expanded prior */ + assert(symName[0] != '.'); // The symbol name must have been expanded prior struct Symbol *sym = sym_FindExactSymbol(symName); if (!sym) { @@ -519,7 +491,7 @@ static struct Symbol *addLabel(char const *symName) } else { updateSymbolFilename(sym); } - /* If the symbol already exists as a ref, just "take over" it */ + // If the symbol already exists as a ref, just "take over" it sym->type = SYM_LABEL; sym->value = sect_GetSymbolOffset(); if (exportall) @@ -531,43 +503,41 @@ static struct Symbol *addLabel(char const *symName) return sym; } -/* - * Add a local (`.name` or `Parent.name`) relocatable symbol - */ +// Add a local (`.name` or `Parent.name`) relocatable symbol struct Symbol *sym_AddLocalLabel(char const *symName) { if (!labelScope) { error("Local label '%s' in main scope\n", symName); return NULL; } - assert(!strchr(labelScope, '.')); /* Assuming no dots in `labelScope` */ + assert(!strchr(labelScope, '.')); // Assuming no dots in `labelScope` char fullName[MAXSYMLEN + 1]; char const *localName = strchr(symName, '.'); - assert(localName); /* There should be at least one dot in `symName` */ - /* Check for something after the dot in `localName` */ + assert(localName); // There should be at least one dot in `symName` + // Check for something after the dot in `localName` if (localName[1] == '\0') { fatalerror("'%s' is a nonsensical reference to an empty local label\n", symName); } - /* Check for more than one dot in `localName` */ + // Check for more than one dot in `localName` if (strchr(localName + 1, '.')) fatalerror("'%s' is a nonsensical reference to a nested local label\n", symName); if (localName == symName) { - /* Expand `symName` to the full `labelScope.symName` name */ + // Expand `symName` to the full `labelScope.symName` name fullSymbolName(fullName, sizeof(fullName), symName, labelScope); symName = fullName; } else { size_t i = 0; - /* Find where `labelScope` and `symName` first differ */ + // Find where `labelScope` and `symName` first differ while (labelScope[i] && symName[i] == labelScope[i]) i++; - /* Check that `symName` starts with `labelScope` and then a '.' */ + // Check that `symName` starts with `labelScope` and then a '.' if (labelScope[i] != '\0' || symName[i] != '.') { size_t parentLen = localName - symName; @@ -579,14 +549,12 @@ struct Symbol *sym_AddLocalLabel(char const *symName) return addLabel(symName); } -/* - * Add a relocatable symbol - */ +// Add a relocatable symbol struct Symbol *sym_AddLabel(char const *symName) { struct Symbol *sym = addLabel(symName); - /* Set the symbol as the new scope */ + // Set the symbol as the new scope if (sym) sym_SetCurrentSymbolScope(sym->name); return sym; @@ -594,9 +562,7 @@ struct Symbol *sym_AddLabel(char const *symName) static uint32_t anonLabelID; -/* - * Add an anonymous label - */ +// Add an anonymous label struct Symbol *sym_AddAnonLabel(void) { if (anonLabelID == UINT32_MAX) { @@ -610,9 +576,7 @@ struct Symbol *sym_AddAnonLabel(void) return addLabel(name); } -/* - * Write an anonymous label's name to a buffer - */ +// Write an anonymous label's name to a buffer void sym_WriteAnonLabelName(char buf[MIN_NB_ELMS(MAXSYMLEN + 1)], uint32_t ofs, bool neg) { uint32_t id = 0; @@ -636,9 +600,7 @@ void sym_WriteAnonLabelName(char buf[MIN_NB_ELMS(MAXSYMLEN + 1)], uint32_t ofs, sprintf(buf, "!%u", id); } -/* - * Export a symbol - */ +// Export a symbol void sym_Export(char const *symName) { if (symName[0] == '!') { @@ -648,15 +610,13 @@ void sym_Export(char const *symName) struct Symbol *sym = sym_FindScopedSymbol(symName); - /* If the symbol doesn't exist, create a ref that can be purged */ + // If the symbol doesn't exist, create a ref that can be purged if (!sym) sym = sym_Ref(symName); sym->isExported = true; } -/* - * Add a macro definition - */ +// Add a macro definition struct Symbol *sym_AddMacro(char const *symName, int32_t defLineNo, char *body, size_t size) { struct Symbol *sym = createNonrelocSymbol(symName, false); @@ -667,20 +627,16 @@ struct Symbol *sym_AddMacro(char const *symName, int32_t defLineNo, char *body, sym->type = SYM_MACRO; sym->macroSize = size; sym->macro = body; - setSymbolFilename(sym); /* TODO: is this really necessary? */ - /* - * The symbol is created at the line after the `endm`, - * override this with the actual definition line - */ + setSymbolFilename(sym); // TODO: is this really necessary? + // The symbol is created at the line after the `endm`, + // override this with the actual definition line sym->fileLine = defLineNo; return sym; } -/* - * Flag that a symbol is referenced in an RPN expression - * and create it if it doesn't exist yet - */ +// Flag that a symbol is referenced in an RPN expression +// and create it if it doesn't exist yet struct Symbol *sym_Ref(char const *symName) { struct Symbol *sym = sym_FindScopedSymbol(symName); @@ -702,9 +658,7 @@ struct Symbol *sym_Ref(char const *symName) return sym; } -/* - * Set whether to export all relocatable symbols by default - */ +// Set whether to export all relocatable symbols by default void sym_SetExportAll(bool set) { exportall = set; @@ -721,9 +675,7 @@ static struct Symbol *createBuiltinSymbol(char const *symName) return sym; } -/* - * Initialize the symboltable - */ +// Initialize the symboltable void sym_Init(time_t now) { PCSymbol = createBuiltinSymbol("@"); @@ -761,7 +713,7 @@ void sym_Init(time_t now) if (now == (time_t)-1) { warn("Couldn't determine current time"); - /* Fall back by pretending we are at the Epoch */ + // Fall back by pretending we are at the Epoch now = 0; } diff --git a/src/asm/util.c b/src/asm/util.c index dbbd89eb..8a4f57ae 100644 --- a/src/asm/util.c +++ b/src/asm/util.c @@ -44,7 +44,7 @@ char const *printChar(int c) buf[2] = 't'; break; - default: /* Print as hex */ + default: // Print as hex buf[0] = '0'; buf[1] = 'x'; snprintf(&buf[2], 3, "%02hhX", (uint8_t)c); // includes the '\0' diff --git a/src/asm/warning.c b/src/asm/warning.c index ab59f3d8..3c177851 100644 --- a/src/asm/warning.c +++ b/src/asm/warning.c @@ -49,19 +49,19 @@ static const enum WarningState defaultWarnings[ARRAY_SIZE(warningStates)] = { enum WarningState warningStates[ARRAY_SIZE(warningStates)]; -bool warningsAreErrors; /* Set if `-Werror` was specified */ +bool warningsAreErrors; // Set if `-Werror` was specified static enum WarningState warningState(enum WarningID id) { - /* Check if warnings are globally disabled */ + // Check if warnings are globally disabled if (!warnings) return WARNING_DISABLED; - /* Get the actual state */ + // Get the actual state enum WarningState state = warningStates[id]; if (state == WARNING_DEFAULT) - /* The state isn't set, grab its default state */ + // The state isn't set, grab its default state state = defaultWarnings[id]; if (warningsAreErrors && state == WARNING_ENABLED) @@ -95,10 +95,10 @@ static const char * const warningFlags[NB_WARNINGS] = { "truncation", "truncation", - /* Meta warnings */ + // Meta warnings "all", "extra", - "everything", /* Especially useful for testing */ + "everything", // Especially useful for testing }; static const struct { @@ -151,7 +151,7 @@ enum MetaWarningCommand { META_WARNING_DONE = NB_WARNINGS }; -/* Warnings that probably indicate an error */ +// Warnings that probably indicate an error static uint8_t const _wallCommands[] = { WARNING_BACKWARDS_FOR, WARNING_BUILTIN_ARG, @@ -167,7 +167,7 @@ static uint8_t const _wallCommands[] = { META_WARNING_DONE }; -/* Warnings that are less likely to indicate an error */ +// Warnings that are less likely to indicate an error static uint8_t const _wextraCommands[] = { WARNING_EMPTY_MACRO_ARG, WARNING_MACRO_SHIFT, @@ -179,7 +179,7 @@ static uint8_t const _wextraCommands[] = { META_WARNING_DONE }; -/* Literally everything. Notably useful for testing */ +// Literally everything. Notably useful for testing static uint8_t const _weverythingCommands[] = { WARNING_BACKWARDS_FOR, WARNING_BUILTIN_ARG, @@ -199,7 +199,7 @@ static uint8_t const _weverythingCommands[] = { WARNING_NUMERIC_STRING_2, WARNING_TRUNCATION_1, WARNING_TRUNCATION_2, - /* WARNING_USER, */ + // WARNING_USER, META_WARNING_DONE }; @@ -213,18 +213,18 @@ void processWarningFlag(char *flag) { static bool setError = false; - /* First, try to match against a "meta" warning */ + // First, try to match against a "meta" warning for (enum WarningID id = META_WARNINGS_START; id < NB_WARNINGS; id++) { - /* TODO: improve the matching performance? */ + // TODO: improve the matching performance? if (!strcmp(flag, warningFlags[id])) { - /* We got a match! */ + // We got a match! if (setError) errx("Cannot make meta warning \"%s\" into an error", flag); for (uint8_t const *ptr = metaWarningCommands[id - META_WARNINGS_START]; *ptr != META_WARNING_DONE; ptr++) { - /* Warning flag, set without override */ + // Warning flag, set without override if (warningStates[*ptr] == WARNING_DEFAULT) warningStates[*ptr] = WARNING_ENABLED; } @@ -233,31 +233,31 @@ void processWarningFlag(char *flag) } } - /* If it's not a meta warning, specially check against `-Werror` */ + // If it's not a meta warning, specially check against `-Werror` if (!strncmp(flag, "error", strlen("error"))) { char *errorFlag = flag + strlen("error"); switch (*errorFlag) { case '\0': - /* `-Werror` */ + // `-Werror` warningsAreErrors = true; return; case '=': - /* `-Werror=XXX` */ + // `-Werror=XXX` setError = true; - processWarningFlag(errorFlag + 1); /* Skip the `=` */ + processWarningFlag(errorFlag + 1); // Skip the `=` setError = false; return; - /* Otherwise, allow parsing as another flag */ + // Otherwise, allow parsing as another flag } } - /* Well, it's either a normal warning or a mistake */ + // Well, it's either a normal warning or a mistake enum WarningState state = setError ? WARNING_ERROR : - /* Not an error, then check if this is a negation */ + // Not an error, then check if this is a negation strncmp(flag, "no-", strlen("no-")) ? WARNING_ENABLED : WARNING_DISABLED; char const *rootFlag = state == WARNING_DISABLED ? flag + strlen("no-") : flag; @@ -308,10 +308,10 @@ void processWarningFlag(char *flag) } } - /* Try to match the flag against a "normal" flag */ + // Try to match the flag against a "normal" flag for (enum WarningID id = 0; id < NB_PLAIN_WARNINGS; id++) { if (!strcmp(rootFlag, warningFlags[id])) { - /* We got a match! */ + // We got a match! warningStates[id] = state; return; } @@ -374,7 +374,7 @@ void warning(enum WarningID id, char const *fmt, ...) case WARNING_DEFAULT: unreachable_(); - /* Not reached */ + // Not reached case WARNING_ENABLED: break; diff --git a/src/fix/main.c b/src/fix/main.c index 23cd9762..d31a33a2 100644 --- a/src/fix/main.c +++ b/src/fix/main.c @@ -29,7 +29,7 @@ #define BANK_SIZE 0x4000 -/* Short options */ +// Short options static const char *optstring = "Ccf:i:jk:l:m:n:Op:r:st:Vv"; /* @@ -191,7 +191,7 @@ static void printAcceptedMBCNames(void) static uint8_t tpp1Rev[2]; -/** +/* * @return False on failure */ static bool readMBCSlice(char const **name, char const *expected) @@ -837,7 +837,7 @@ static ssize_t writeBytes(int fd, void *buf, size_t len) return total; } -/** +/* * @param rom0 A pointer to rom0 * @param addr What address to check * @param fixedByte The fixed byte at the address @@ -853,7 +853,7 @@ static void overwriteByte(uint8_t *rom0, uint16_t addr, uint8_t fixedByte, char rom0[addr] = fixedByte; } -/** +/* * @param rom0 A pointer to rom0 * @param startAddr What address to begin checking from * @param fixed The fixed bytes at the address @@ -878,7 +878,7 @@ static void overwriteBytes(uint8_t *rom0, uint16_t startAddr, uint8_t const *fix memcpy(&rom0[startAddr], fixed, size); } -/** +/* * @param input File descriptor to be used for reading * @param output File descriptor to be used for writing, may be equal to `input` * @param name The file's name, to be displayed for error output diff --git a/src/gfx/main.cpp b/src/gfx/main.cpp index 3aa334e4..ad974144 100644 --- a/src/gfx/main.cpp +++ b/src/gfx/main.cpp @@ -153,7 +153,7 @@ static void printUsage(void) { exit(1); } -/** +/* * Parses a number at the beginning of a string, moving the pointer to skip the parsed characters * Returns the provided errVal on error */ @@ -179,7 +179,7 @@ static uint16_t parseNumber(char *&string, char const *errPrefix, uint16_t errVa } } - /** + /* * Turns a digit into its numeric value in the current base, if it has one. * Maximum is inclusive. The string_view is modified to "consume" all digits. * Returns 255 on parse failure (including wrong char for base), in which case @@ -248,7 +248,7 @@ static void registerInput(char const *arg) { } } -/** +/* * Turn an "at-file"'s contents into an argv that `getopt` can handle * @param argPool Argument characters will be appended to this vector, for storage purposes. */ @@ -317,7 +317,7 @@ static std::vector readAtFile(std::string const &path, std::vector } while (c != '\n' && c != EOF); // End if we reached EOL } } -/** +/* * Parses an arg vector, modifying `options` as options are read. * The three booleans are for the "auto path" flags, since their processing must be deferred to the * end of option parsing. @@ -785,7 +785,7 @@ void Palette::addColor(uint16_t color) { } } -/** +/* * Returns the ID of the color in the palette, or `size()` if the color is not in */ uint8_t Palette::indexOf(uint16_t color) const { diff --git a/src/gfx/pal_packing.cpp b/src/gfx/pal_packing.cpp index 21af352f..72d6ffe8 100644 --- a/src/gfx/pal_packing.cpp +++ b/src/gfx/pal_packing.cpp @@ -39,12 +39,12 @@ namespace packing { // Tile | Proto-palette // Page | Palette -/** +/* * A reference to a proto-palette, and attached attributes for sorting purposes */ struct ProtoPalAttrs { size_t const protoPalIndex; - /** + /* * Pages from which we are banned (to prevent infinite loops) * This is dynamic because we wish not to hard-cap the amount of palettes */ @@ -62,7 +62,7 @@ struct ProtoPalAttrs { } }; -/** +/* * A collection of proto-palettes assigned to a palette * Does not contain the actual color indices because we need to be able to remove elements */ @@ -139,7 +139,7 @@ public: } const_iterator end() const { return const_iterator{&_assigned, _assigned.end()}; } - /** + /* * Assigns a new ProtoPalAttrs in a free slot, assuming there is one * Args are passed to the `ProtoPalAttrs`'s constructor */ @@ -198,7 +198,7 @@ private: return colors; } public: - /** + /* * Returns the number of distinct colors */ size_t volume() const { return uniqueColors().size(); } @@ -208,7 +208,7 @@ public: return colors.size() <= options.maxOpaqueColors(); } - /** + /* * Computes the "relative size" of a proto-palette on this palette */ double relSizeOf(ProtoPalette const &protoPal) const { @@ -227,7 +227,7 @@ public: return relSize; } - /** + /* * Computes the "relative size" of a set of proto-palettes on this palette */ template @@ -237,7 +237,7 @@ public: addUniqueColors(colors, std::forward(begin), end, protoPals); return colors.size(); } - /** + /* * Computes the "relative size" of a set of colors on this palette */ template diff --git a/src/gfx/pal_sorting.cpp b/src/gfx/pal_sorting.cpp index 5001361a..17c19cf0 100644 --- a/src/gfx/pal_sorting.cpp +++ b/src/gfx/pal_sorting.cpp @@ -1,3 +1,10 @@ +/* + * This file is part of RGBDS. + * + * Copyright (c) 2022, Eldred Habert and RGBDS contributors. + * + * SPDX-License-Identifier: MIT + */ #include "gfx/pal_sorting.hpp" diff --git a/src/gfx/pal_spec.cpp b/src/gfx/pal_spec.cpp index 797eb3f1..52213ccf 100644 --- a/src/gfx/pal_spec.cpp +++ b/src/gfx/pal_spec.cpp @@ -165,7 +165,7 @@ void parseInlinePalSpec(char const * const rawArg) { } } -/** +/* * Tries to read some magic bytes from the provided `file`. * Returns whether the magic was correctly read. */ @@ -191,7 +191,7 @@ static T readBE(U const *bytes) { return val; } -/** +/* * **Appends** the first line read from `file` to the end of the provided `buffer`. */ static void readLine(std::filebuf &file, std::string &buffer) { @@ -214,7 +214,7 @@ static void readLine(std::filebuf &file, std::string &buffer) { } // FIXME: Normally we'd use `std::from_chars`, but that's not available with GCC 7 -/** +/* * Parses the initial part of a string_view, advancing the "read index" as it does */ static uint16_t parseDec(std::string const &str, std::string::size_type &n) { diff --git a/src/gfx/process.cpp b/src/gfx/process.cpp index 612a46d9..8f7e95ca 100644 --- a/src/gfx/process.cpp +++ b/src/gfx/process.cpp @@ -42,7 +42,7 @@ class ImagePalette { public: ImagePalette() = default; - /** + /* * Registers a color in the palette. * If the newly inserted color "conflicts" with another one (different color, but same CGB * color), then the other color is returned. Otherwise, `nullptr` is returned. @@ -164,7 +164,7 @@ public: return true; } - /** + /* * Reads a PNG and notes all of its colors * * This code is more complicated than strictly necessary, but that's because of the API @@ -466,7 +466,7 @@ public: }; class RawTiles { - /** + /* * A tile which only contains indices into the image's global palette */ class RawTile { @@ -481,7 +481,7 @@ private: std::vector _tiles; public: - /** + /* * Creates a new raw tile, and returns a reference to it so it can be filled in */ RawTile &newTile() { @@ -491,7 +491,7 @@ public: }; struct AttrmapEntry { - /** + /* * This field can either be a proto-palette ID, or `transparent` to indicate that the * corresponding tile is fully transparent. If you are looking to get the palette ID for this * attrmap entry while correctly handling the above, use `getPalID`. @@ -831,7 +831,7 @@ struct UniqueTiles { UniqueTiles(UniqueTiles const &) = delete; UniqueTiles(UniqueTiles &&) = default; - /** + /* * Adds a tile to the collection, and returns its ID */ std::tuple addTile(Png::TilesVisitor::Tile const &tile, @@ -857,7 +857,7 @@ struct UniqueTiles { auto end() const { return tiles.end(); } }; -/** +/* * Generate tile data while deduplicating unique tiles (via mirroring if enabled) * Additionally, while we have the info handy, convert from the 16-bit "global" tile IDs to * 8-bit tile IDs + the bank bit; this will save the work when we output the data later (potentially @@ -986,16 +986,17 @@ void process() { protoPalettes[n] = tileColors; // Override them // Remove any other proto-palettes that we encompass // (Example [(0, 1), (0, 2)], inserting (0, 1, 2)) - /* The following code does its job, except that references to the removed + /* + * The following code does its job, except that references to the removed * proto-palettes are not updated, causing issues. * TODO: overlap might not be detrimental to the packing algorithm. * Investigation is necessary, especially if pathological cases are found. - - for (size_t i = protoPalettes.size(); --i != n;) { - if (tileColors.compare(protoPalettes[i]) == ProtoPalette::WE_BIGGER) { - protoPalettes.erase(protoPalettes.begin() + i); - } - } + * + * for (size_t i = protoPalettes.size(); --i != n;) { + * if (tileColors.compare(protoPalettes[i]) == ProtoPalette::WE_BIGGER) { + * protoPalettes.erase(protoPalettes.begin() + i); + * } + * } */ [[fallthrough]]; diff --git a/src/gfx/rgba.cpp b/src/gfx/rgba.cpp index 1bea2b7a..c3486bac 100644 --- a/src/gfx/rgba.cpp +++ b/src/gfx/rgba.cpp @@ -1,3 +1,11 @@ +/* + * This file is part of RGBDS. + * + * Copyright (c) 2022, Eldred Habert and RGBDS contributors. + * + * SPDX-License-Identifier: MIT + */ + #include "gfx/rgba.hpp" #include diff --git a/src/hashmap.c b/src/hashmap.c index b9746556..c6ce7b6a 100644 --- a/src/hashmap.c +++ b/src/hashmap.c @@ -15,10 +15,8 @@ #include "error.h" #include "hashmap.h" -/* - * The lower half of the hash is used to index the "master" table, - * the upper half is used to help resolve collisions more quickly - */ +// The lower half of the hash is used to index the "master" table, +// the upper half is used to help resolve collisions more quickly #define UINT_BITS_(NB_BITS) uint##NB_BITS##_t #define UINT_BITS(NB_BITS) UINT_BITS_(NB_BITS) typedef UINT_BITS(HASH_NB_BITS) HashType; @@ -34,7 +32,7 @@ struct HashMapEntry { #define FNV_OFFSET_BASIS 0x811c9dc5 #define FNV_PRIME 16777619 -/* FNV-1a hash */ +// FNV-1a hash static HashType hash(char const *str) { HashType hash = FNV_OFFSET_BASIS; diff --git a/src/link/assign.c b/src/link/assign.c index b0f6e7b5..930803e3 100644 --- a/src/link/assign.c +++ b/src/link/assign.c @@ -34,14 +34,12 @@ struct FreeSpace { struct FreeSpace *next, *prev; }; -/* Table of free space for each bank */ +// Table of free space for each bank struct FreeSpace *memory[SECTTYPE_INVALID]; uint64_t nbSectionsToAssign; -/** - * Init the free space-modelling structs - */ +// Init the free space-modelling structs static void initFreeSpace(void) { for (enum SectionType type = 0; type < SECTTYPE_INVALID; type++) { @@ -63,7 +61,7 @@ static void initFreeSpace(void) } } -/** +/* * Assigns a section to a given memory location * @param section The section to assign * @param location The location to assign the section to @@ -85,7 +83,7 @@ static void assignSection(struct Section *section, struct MemoryLocation const * out_AddSection(section); } -/** +/* * Checks whether a given location is suitable for placing a given section * This checks not only that the location has enough room for the section, but * also that the constraints (alignment...) are respected. @@ -111,7 +109,7 @@ static bool isLocationSuitable(struct Section const *section, <= freeSpace->address + freeSpace->size; } -/** +/* * Finds a suitable location to place a section at. * @param section The section to be placed * @param location A pointer to a location struct that will be filled @@ -146,61 +144,57 @@ static struct FreeSpace *getPlacement(struct Section const *section, struct FreeSpace *space; for (;;) { - /* Switch to the beginning of the next bank */ + // Switch to the beginning of the next bank #define BANK_INDEX (location->bank - sectionTypeInfo[section->type].firstBank) space = memory[section->type][BANK_INDEX].next; if (space) location->address = space->address; - /* Process locations in that bank */ + // Process locations in that bank while (space) { - /* If that location is OK, return it */ + // If that location is OK, return it if (isLocationSuitable(section, space, location)) return space; - /* Go to the next *possible* location */ + // Go to the next *possible* location if (section->isAddressFixed) { - /* - * If the address is fixed, there can be only - * one candidate block per bank; if we already - * reached it, give up. - */ + // If the address is fixed, there can be only + // one candidate block per bank; if we already + // reached it, give up. if (location->address < section->org) location->address = section->org; else - /* Try again in next bank */ + // Try again in next bank space = NULL; } else if (section->isAlignFixed) { - /* Move to next aligned location */ - /* Move back to alignment boundary */ + // Move to next aligned location + // Move back to alignment boundary location->address -= section->alignOfs; - /* Ensure we're there (e.g. on first check) */ + // Ensure we're there (e.g. on first check) location->address &= ~section->alignMask; - /* Go to next align boundary and add offset */ + // Go to next align boundary and add offset location->address += section->alignMask + 1 + section->alignOfs; } else { - /* Any location is fine, so, next free block */ + // Any location is fine, so, next free block space = space->next; if (space) location->address = space->address; } - /* - * If that location is past the current block's end, - * go forwards until that is no longer the case. - */ + // If that location is past the current block's end, + // go forwards until that is no longer the case. while (space && location->address >= space->address + space->size) space = space->next; - /* Try again with the new location/free space combo */ + // Try again with the new location/free space combo } if (section->isBankFixed) return NULL; - /* Try again in the next bank */ + // Try again in the next bank location->bank++; if (location->bank > sectionTypeInfo[section->type].lastBank) return NULL; @@ -208,7 +202,7 @@ static struct FreeSpace *getPlacement(struct Section const *section, } } -/** +/* * Places a section in a suitable location, or error out if it fails to. * @warning Due to the implemented algorithm, this should be called with * sections of decreasing size. @@ -218,12 +212,10 @@ static void placeSection(struct Section *section) { struct MemoryLocation location; - /* Specially handle 0-byte SECTIONs, as they can't overlap anything */ + // Specially handle 0-byte SECTIONs, as they can't overlap anything if (section->size == 0) { - /* - * Unless the SECTION's address was fixed, the starting address - * is fine for any alignment, as checked in sect_DoSanityChecks. - */ + // Unless the SECTION's address was fixed, the starting address + // is fine for any alignment, as checked in sect_DoSanityChecks. location.address = section->isAddressFixed ? section->org : sectionTypeInfo[section->type].startAddr; @@ -234,60 +226,56 @@ static void placeSection(struct Section *section) return; } - /* - * Place section using first-fit decreasing algorithm - * https://en.wikipedia.org/wiki/Bin_packing_problem#First-fit_algorithm - */ + // Place section using first-fit decreasing algorithm + // https://en.wikipedia.org/wiki/Bin_packing_problem#First-fit_algorithm struct FreeSpace *freeSpace = getPlacement(section, &location); if (freeSpace) { assignSection(section, &location); - /* Split the free space */ + // Split the free space bool noLeftSpace = freeSpace->address == section->org; bool noRightSpace = freeSpace->address + freeSpace->size == section->org + section->size; if (noLeftSpace && noRightSpace) { - /* The free space is entirely deleted */ + // The free space is entirely deleted freeSpace->prev->next = freeSpace->next; if (freeSpace->next) freeSpace->next->prev = freeSpace->prev; - /* - * If the space is the last one on the list, set its - * size to 0 so it doesn't get picked, but don't free() - * it as it will be freed when cleaning up - */ + // If the space is the last one on the list, set its + // size to 0 so it doesn't get picked, but don't free() + // it as it will be freed when cleaning up free(freeSpace); } else if (!noLeftSpace && !noRightSpace) { - /* The free space is split in two */ + // The free space is split in two struct FreeSpace *newSpace = malloc(sizeof(*newSpace)); if (!newSpace) err("Failed to split new free space"); - /* Append the new space after the chosen one */ + // Append the new space after the chosen one newSpace->prev = freeSpace; newSpace->next = freeSpace->next; if (freeSpace->next) freeSpace->next->prev = newSpace; freeSpace->next = newSpace; - /* Set its parameters */ + // Set its parameters newSpace->address = section->org + section->size; newSpace->size = freeSpace->address + freeSpace->size - newSpace->address; - /* Set the original space's new parameters */ + // Set the original space's new parameters freeSpace->size = section->org - freeSpace->address; - /* address is unmodified */ + // address is unmodified } else { - /* The amount of free spaces doesn't change: resize! */ + // The amount of free spaces doesn't change: resize! freeSpace->size -= section->size; if (noLeftSpace) - /* The free space is moved *and* resized */ + // The free space is moved *and* resized freeSpace->address += section->size; } return; } - /* Please adjust depending on longest message below */ + // Please adjust depending on longest message below char where[64]; if (section->isBankFixed && nbbanks(section->type) != 1) { @@ -312,16 +300,16 @@ static void placeSection(struct Section *section) strcpy(where, "anywhere"); } - /* If a section failed to go to several places, nothing we can report */ + // If a section failed to go to several places, nothing we can report if (!section->isBankFixed || !section->isAddressFixed) errx("Unable to place \"%s\" (%s section) %s", section->name, sectionTypeInfo[section->type].name, where); - /* If the section just can't fit the bank, report that */ + // If the section just can't fit the bank, report that else if (section->org + section->size > endaddr(section->type) + 1) errx("Unable to place \"%s\" (%s section) %s: section runs past end of region ($%04x > $%04x)", section->name, sectionTypeInfo[section->type].name, where, section->org + section->size, endaddr(section->type) + 1); - /* Otherwise there is overlap with another section */ + // Otherwise there is overlap with another section else errx("Unable to place \"%s\" (%s section) %s: section overlaps with \"%s\"", section->name, sectionTypeInfo[section->type].name, where, @@ -339,7 +327,7 @@ struct UnassignedSection { static struct UnassignedSection *unassignedSections[1 << 3] = {0}; static struct UnassignedSection *sections; -/** +/* * Categorize a section depending on how constrained it is * This is so the most-constrained sections are placed first * @param section The section to categorize @@ -354,13 +342,13 @@ static void categorizeSection(struct Section *section, void *arg) constraints |= BANK_CONSTRAINED; if (section->isAddressFixed) constraints |= ORG_CONSTRAINED; - /* Can't have both! */ + // Can't have both! else if (section->isAlignFixed) constraints |= ALIGN_CONSTRAINED; struct UnassignedSection **ptr = &unassignedSections[constraints]; - /* Insert section while keeping the list sorted by decreasing size */ + // Insert section while keeping the list sorted by decreasing size while (*ptr && (*ptr)->section->size > section->size) ptr = &(*ptr)->next; @@ -375,9 +363,9 @@ void assign_AssignSections(void) { verbosePrint("Beginning assignment...\n"); - /** Initialize assignment **/ + // Initialize assignment - /* Generate linked lists of sections to assign */ + // Generate linked lists of sections to assign sections = malloc(sizeof(*sections) * nbSectionsToAssign + 1); if (!sections) err("Failed to allocate memory for section assignment"); @@ -387,9 +375,9 @@ void assign_AssignSections(void) nbSectionsToAssign = 0; sect_ForEach(categorizeSection, NULL); - /** Place sections, starting with the most constrained **/ + // Place sections, starting with the most constrained - /* Specially process fully-constrained sections because of overlaying */ + // Specially process fully-constrained sections because of overlaying struct UnassignedSection *sectionPtr = unassignedSections[BANK_CONSTRAINED | ORG_CONSTRAINED]; @@ -399,11 +387,11 @@ void assign_AssignSections(void) sectionPtr = sectionPtr->next; } - /* If all sections were fully constrained, we have nothing left to do */ + // If all sections were fully constrained, we have nothing left to do if (!nbSectionsToAssign) return; - /* Overlaying requires only fully-constrained sections */ + // Overlaying requires only fully-constrained sections verbosePrint("Assigning other sections...\n"); if (overlayFileName) { fprintf(stderr, "FATAL: All sections must be fixed when using an overlay file"); @@ -427,7 +415,7 @@ max_out: exit(1); } - /* Assign all remaining sections by decreasing constraint order */ + // Assign all remaining sections by decreasing constraint order for (int8_t constraints = BANK_CONSTRAINED | ALIGN_CONSTRAINED; constraints >= 0; constraints--) { sectionPtr = unassignedSections[constraints]; diff --git a/src/link/main.c b/src/link/main.c index 99c4a355..33292623 100644 --- a/src/link/main.c +++ b/src/link/main.c @@ -33,34 +33,33 @@ #include "platform.h" #include "version.h" -bool isDmgMode; /* -d */ -char *linkerScriptName; /* -l */ -char const *mapFileName; /* -m */ -bool noSymInMap; /* -M */ -char const *symFileName; /* -n */ -char const *overlayFileName; /* -O */ -char const *outputFileName; /* -o */ -uint8_t padValue; /* -p */ +bool isDmgMode; // -d +char *linkerScriptName; // -l +char const *mapFileName; // -m +bool noSymInMap; // -M +char const *symFileName; // -n +char const *overlayFileName; // -O +char const *outputFileName; // -o +uint8_t padValue; // -p // Setting these three to 0 disables the functionality -uint16_t scrambleROMX = 0; /* -S */ +uint16_t scrambleROMX = 0; // -S uint8_t scrambleWRAMX = 0; uint8_t scrambleSRAM = 0; -bool is32kMode; /* -t */ -bool beVerbose; /* -v */ -bool isWRA0Mode; /* -w */ -bool disablePadding; /* -x */ +bool is32kMode; // -t +bool beVerbose; // -v +bool isWRA0Mode; // -w +bool disablePadding; // -x static uint32_t nbErrors = 0; -/***** Helper function to dump a file stack to stderr *****/ - +// Helper function to dump a file stack to stderr char const *dumpFileStack(struct FileStackNode const *node) { char const *lastName; if (node->parent) { lastName = dumpFileStack(node->parent); - /* REPT nodes use their parent's name */ + // REPT nodes use their parent's name if (node->type != NODE_REPT) lastName = node->name; fprintf(stderr, "(%" PRIu32 ") -> %s", node->lineNo, lastName); @@ -165,7 +164,7 @@ FILE *openFile(char const *fileName, char const *mode) return file; } -/* Short options */ +// Short options static const char *optstring = "dl:m:Mn:O:o:p:S:s:tVvWwx"; /* @@ -197,9 +196,7 @@ static struct option const longopts[] = { { NULL, no_argument, NULL, 0 } }; -/** - * Prints the program's usage to stdout. - */ +// Prints the program's usage to stdout. static void printUsage(void) { fputs( @@ -219,10 +216,8 @@ static void printUsage(void) stderr); } -/** - * Cleans up what has been done - * Mostly here to please tools such as `valgrind` so actual errors can be seen - */ +// Cleans up what has been done +// Mostly here to please tools such as `valgrind` so actual errors can be seen static void cleanup(void) { obj_Cleanup(); @@ -362,10 +357,10 @@ _Noreturn void reportErrors(void) { int main(int argc, char *argv[]) { int optionChar; - char *endptr; /* For error checking with `strtoul` */ - unsigned long value; /* For storing `strtoul`'s return value */ + char *endptr; // For error checking with `strtoul` + unsigned long value; // For storing `strtoul`'s return value - /* Parse options */ + // Parse options while ((optionChar = musl_getopt_long_only(argc, argv, optstring, longopts, NULL)) != -1) { switch (optionChar) { @@ -407,7 +402,7 @@ int main(int argc, char *argv[]) parseScrambleSpec(musl_optarg); break; case 's': - /* FIXME: nobody knows what this does, figure it out */ + // FIXME: nobody knows what this does, figure it out (void)musl_optarg; warning(NULL, 0, "Nobody has any idea what `-s` does"); break; @@ -425,7 +420,7 @@ int main(int argc, char *argv[]) break; case 'x': disablePadding = true; - /* implies tiny mode */ + // implies tiny mode is32kMode = true; break; default: @@ -436,41 +431,41 @@ int main(int argc, char *argv[]) int curArgIndex = musl_optind; - /* If no input files were specified, the user must have screwed up */ + // If no input files were specified, the user must have screwed up if (curArgIndex == argc) { fputs("FATAL: no input files\n", stderr); printUsage(); exit(1); } - /* Patch the size array depending on command-line options */ + // Patch the size array depending on command-line options if (!is32kMode) sectionTypeInfo[SECTTYPE_ROM0].size = 0x4000; if (!isWRA0Mode) sectionTypeInfo[SECTTYPE_WRAM0].size = 0x1000; - /* Patch the bank ranges array depending on command-line options */ + // Patch the bank ranges array depending on command-line options if (isDmgMode) sectionTypeInfo[SECTTYPE_VRAM].lastBank = 0; - /* Read all object files first, */ + // Read all object files first, for (obj_Setup(argc - curArgIndex); curArgIndex < argc; curArgIndex++) obj_ReadFile(argv[curArgIndex], argc - curArgIndex - 1); - /* apply the linker script's modifications, */ + // apply the linker script's modifications, if (linkerScriptName) { verbosePrint("Reading linker script...\n"); linkerScript = openFile(linkerScriptName, "r"); - /* Modify all sections according to the linker script */ + // Modify all sections according to the linker script struct SectionPlacement *placement; while ((placement = script_NextSection())) { struct Section *section = placement->section; assert(section->offset == 0); - /* Check if this doesn't conflict with what the code says */ + // Check if this doesn't conflict with what the code says if (section->type == SECTTYPE_INVALID) { for (struct Section *sect = section; sect; sect = sect->nextu) sect->type = placement->type; // SDCC "unknown" sections @@ -493,7 +488,7 @@ int main(int argc, char *argv[]) section->org = placement->org; section->isBankFixed = true; section->bank = placement->bank; - section->isAlignFixed = false; /* The alignment is satisfied */ + section->isAlignFixed = false; // The alignment is satisfied } fclose(linkerScript); @@ -506,7 +501,7 @@ int main(int argc, char *argv[]) } - /* then process them, */ + // then process them, obj_DoSanityChecks(); if (nbErrors != 0) reportErrors(); @@ -514,12 +509,12 @@ int main(int argc, char *argv[]) obj_CheckAssertions(); assign_Cleanup(); - /* and finally output the result. */ + // and finally output the result. patch_ApplyPatches(); if (nbErrors != 0) reportErrors(); out_WriteFiles(); - /* Do cleanup before quitting, though. */ + // Do cleanup before quitting, though. cleanup(); } diff --git a/src/link/object.c b/src/link/object.c index e9350305..ab9bd6e5 100644 --- a/src/link/object.c +++ b/src/link/object.c @@ -39,12 +39,10 @@ static struct { } *nodes; static struct Assertion *assertions; -/***** Helper functions for reading object files *****/ +// Helper functions for reading object files -/* - * Internal, DO NOT USE. - * For helper wrapper macros defined below, such as `tryReadlong` - */ +// Internal, DO NOT USE. +// For helper wrapper macros defined below, such as `tryReadlong` #define tryRead(func, type, errval, var, file, ...) \ do { \ FILE *tmpFile = file; \ @@ -58,7 +56,7 @@ static struct Assertion *assertions; var = tmpVal; \ } while (0) -/** +/* * Reads an unsigned long (32-bit) value from a file. * @param file The file to read from. This will read 4 bytes from the file. * @return The value read, cast to a int64_t, or -1 on failure. @@ -67,25 +65,24 @@ static int64_t readlong(FILE *file) { uint32_t value = 0; - /* Read the little-endian value byte by byte */ + // Read the little-endian value byte by byte for (uint8_t shift = 0; shift < sizeof(value) * CHAR_BIT; shift += 8) { int byte = getc(file); if (byte == EOF) return INT64_MAX; - /* This must be casted to `unsigned`, not `uint8_t`. Rationale: - * the type of the shift is the type of `byte` after undergoing - * integer promotion, which would be `int` if this was casted to - * `uint8_t`, because int is large enough to hold a byte. This - * however causes values larger than 127 to be too large when - * shifted, potentially triggering undefined behavior. - */ + // This must be casted to `unsigned`, not `uint8_t`. Rationale: + // the type of the shift is the type of `byte` after undergoing + // integer promotion, which would be `int` if this was casted to + // `uint8_t`, because int is large enough to hold a byte. This + // however causes values larger than 127 to be too large when + // shifted, potentially triggering undefined behavior. value |= (unsigned int)byte << shift; } return value; } -/** +/* * 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. * @param var The variable to stash the number into @@ -96,9 +93,9 @@ static int64_t readlong(FILE *file) #define tryReadlong(var, file, ...) \ tryRead(readlong, int64_t, INT64_MAX, var, file, __VA_ARGS__) -/* There is no `readbyte`, just use `fgetc` or `getc`. */ +// There is no `readbyte`, just use `fgetc` or `getc`. -/** +/* * 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. @@ -110,7 +107,7 @@ static int64_t readlong(FILE *file) #define tryFgetc(var, file, ...) \ tryRead(fgetc, int, EOF, var, file, __VA_ARGS__) -/** +/* * 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. @@ -122,7 +119,7 @@ static int64_t readlong(FILE *file) #define tryGetc(var, file, ...) \ tryRead(getc, int, EOF, var, file, __VA_ARGS__) -/** +/* * Reads a '\0'-terminated string from a file. * @param file The file to read from. The file position will be advanced. * @return The string read, or NULL on failure. @@ -130,26 +127,26 @@ static int64_t readlong(FILE *file) */ static char *readstr(FILE *file) { - /* Default buffer size, have it close to the average string length */ + // Default buffer size, have it close to the average string length size_t capacity = 32 / 2; size_t index = -1; - /* Force the first iteration to allocate */ + // Force the first iteration to allocate char *str = NULL; do { - /* Prepare going to next char */ + // Prepare going to next char index++; - /* If the buffer isn't suitable to write the next char... */ + // If the buffer isn't suitable to write the next char... if (index >= capacity || !str) { capacity *= 2; str = realloc(str, capacity); - /* End now in case of error */ + // End now in case of error if (!str) return NULL; } - /* Read char */ + // Read char int byte = getc(file); if (byte == EOF) { @@ -161,7 +158,7 @@ static char *readstr(FILE *file) return str; } -/** +/* * 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. * @param var The variable to stash the string into @@ -172,9 +169,9 @@ static char *readstr(FILE *file) #define tryReadstr(var, file, ...) \ tryRead(readstr, char*, NULL, var, file, __VA_ARGS__) -/***** Functions to parse object files *****/ +// Functions to parse object files -/** +/* * Reads a file stack node form a file. * @param file The file to read from * @param nodes The file's array of nodes @@ -217,7 +214,7 @@ static void readFileStackNode(FILE *file, struct FileStackNode fileNodes[], uint } } -/** +/* * Reads a symbol from a file. * @param file The file to read from * @param symbol The struct to fill @@ -230,7 +227,7 @@ static void readSymbol(FILE *file, struct Symbol *symbol, fileName); tryGetc(symbol->type, file, "%s: Cannot read \"%s\"'s type: %s", fileName, symbol->name); - /* If the symbol is defined in this file, read its definition */ + // If the symbol is defined in this file, read its definition if (symbol->type != SYMTYPE_IMPORT) { symbol->objFileName = fileName; uint32_t nodeID; @@ -253,7 +250,7 @@ static void readSymbol(FILE *file, struct Symbol *symbol, } } -/** +/* * Reads a patch from a file. * @param file The file to read from * @param patch The struct to fill @@ -303,7 +300,7 @@ static void readPatch(FILE *file, struct Patch *patch, char const *fileName, cha feof(file) ? "Unexpected end of file" : strerror(errno)); } -/** +/* * Sets a patch's pcSection from its pcSectionID. * @param patch The struct to fix */ @@ -313,7 +310,7 @@ static void linkPatchToPCSect(struct Patch *patch, struct Section *fileSections[ : fileSections[patch->pcSectionID]; } -/** +/* * Reads a section from a file. * @param file The file to read from * @param section The struct to fill @@ -372,7 +369,7 @@ static void readSection(FILE *file, struct Section *section, char const *fileNam section->alignOfs = tmp; if (sect_HasData(section->type)) { - /* Ensure we never allocate 0 bytes */ + // Ensure we never allocate 0 bytes uint8_t *data = malloc(sizeof(*data) * section->size + 1); if (!data) @@ -404,7 +401,7 @@ static void readSection(FILE *file, struct Section *section, char const *fileNam } } -/** +/* * Links a symbol to a section, keeping the section's symbol list sorted. * @param symbol The symbol to link * @param section The section to link @@ -433,7 +430,7 @@ static void linkSymToSect(struct Symbol *symbol, struct Section *section) section->nbSymbols++; } -/** +/* * Reads an assertion from a file * @param file The file to read from * @param assert The struct to fill @@ -500,7 +497,7 @@ void obj_ReadFile(char const *fileName, unsigned int fileID) return; } - /* Begin by reading the magic bytes */ + // Begin by reading the magic bytes int matchedElems; if (fscanf(file, RGBDS_OBJECT_VERSION_STRING "%n", &matchedElems) == 1 @@ -536,7 +533,7 @@ void obj_ReadFile(char const *fileName, unsigned int fileID) for (uint32_t i = nodes[fileID].nbNodes; i--; ) readFileStackNode(file, nodes[fileID].nodes, i, fileName); - /* This file's symbols, kept to link sections to them */ + // This file's symbols, kept to link sections to them struct Symbol **fileSymbols = malloc(sizeof(*fileSymbols) * nbSymbols + 1); if (!fileSymbols) @@ -556,7 +553,7 @@ void obj_ReadFile(char const *fileName, unsigned int fileID) verbosePrint("Reading %" PRIu32 " symbols...\n", nbSymbols); for (uint32_t i = 0; i < nbSymbols; i++) { - /* Read symbol */ + // Read symbol struct Symbol *symbol = malloc(sizeof(*symbol)); if (!symbol) @@ -570,13 +567,13 @@ void obj_ReadFile(char const *fileName, unsigned int fileID) nbSymPerSect[symbol->sectionID]++; } - /* This file's sections, stored in a table to link symbols to them */ + // This file's sections, stored in a table to link symbols to them struct Section **fileSections = malloc(sizeof(*fileSections) * (nbSections ? nbSections : 1)); verbosePrint("Reading %" PRIu32 " sections...\n", nbSections); for (uint32_t i = 0; i < nbSections; i++) { - /* Read section */ + // Read section fileSections[i] = malloc(sizeof(*fileSections[i])); if (!fileSections[i]) err("%s: Couldn't create new section", fileName); @@ -600,7 +597,7 @@ void obj_ReadFile(char const *fileName, unsigned int fileID) free(nbSymPerSect); - /* Give patches' PC section pointers to their sections */ + // Give patches' PC section pointers to their sections for (uint32_t i = 0; i < nbSections; i++) { if (sect_HasData(fileSections[i]->type)) { for (uint32_t j = 0; j < fileSections[i]->nbPatches; j++) @@ -608,7 +605,7 @@ void obj_ReadFile(char const *fileName, unsigned int fileID) } } - /* Give symbols' section pointers to their sections */ + // Give symbols' section pointers to their sections for (uint32_t i = 0; i < nbSymbols; i++) { int32_t sectionID = fileSymbols[i]->sectionID; @@ -617,12 +614,12 @@ void obj_ReadFile(char const *fileName, unsigned int fileID) } else { struct Section *section = fileSections[sectionID]; - /* Give the section a pointer to the symbol as well */ + // Give the section a pointer to the symbol as well linkSymToSect(fileSymbols[i], section); if (section->modifier != SECTION_NORMAL) { if (section->modifier == SECTION_FRAGMENT) - /* Add the fragment's offset to the symbol's */ + // Add the fragment's offset to the symbol's fileSymbols[i]->offset += section->offset; section = getMainSection(section); } diff --git a/src/link/output.c b/src/link/output.c index 5848b4aa..b344c191 100644 --- a/src/link/output.c +++ b/src/link/output.c @@ -47,7 +47,7 @@ static struct { } *banks; } sections[SECTTYPE_INVALID]; -/* Defines the order in which types are output to the sym and map files */ +// Defines the order in which types are output to the sym and map files static enum SectionType typeMap[SECTTYPE_INVALID] = { SECTTYPE_ROM0, SECTTYPE_ROMX, @@ -124,7 +124,7 @@ struct Section const *out_OverlappingSection(struct Section const *section) return NULL; } -/** +/* * Performs sanity checks on the overlay file. * @return The number of ROM banks in the overlay file */ @@ -140,7 +140,7 @@ static uint32_t checkOverlaySize(void) long overlaySize = ftell(overlayFile); - /* Reset back to beginning */ + // Reset back to beginning fseek(overlayFile, 0, SEEK_SET); if (overlaySize % BANK_SIZE) @@ -157,7 +157,7 @@ static uint32_t checkOverlaySize(void) return nbOverlayBanks; } -/** +/* * Expand sections[SECTTYPE_ROMX].banks to cover all the overlay banks. * This ensures that writeROM will output each bank, even if some are not * covered by any sections. @@ -165,9 +165,9 @@ static uint32_t checkOverlaySize(void) */ static void coverOverlayBanks(uint32_t nbOverlayBanks) { - /* 2 if is32kMode, 1 otherwise */ + // 2 if is32kMode, 1 otherwise uint32_t nbRom0Banks = sectionTypeInfo[SECTTYPE_ROM0].size / BANK_SIZE; - /* Discount ROM0 banks to avoid outputting too much */ + // Discount ROM0 banks to avoid outputting too much uint32_t nbUncoveredBanks = nbOverlayBanks - nbRom0Banks > sections[SECTTYPE_ROMX].nbBanks ? nbOverlayBanks - nbRom0Banks : 0; @@ -186,7 +186,7 @@ static void coverOverlayBanks(uint32_t nbOverlayBanks) } } -/** +/* * Write a ROM bank's sections to the output file. * @param bankSections The bank's sections, ordered by increasing address * @param baseOffset The address of the bank's first byte in GB address space @@ -201,18 +201,18 @@ static void writeBank(struct SortedSection *bankSections, uint16_t baseOffset, struct Section const *section = bankSections->section; assert(section->offset == 0); - /* Output padding up to the next SECTION */ + // Output padding up to the next SECTION while (offset + baseOffset < section->org) { putc(overlayFile ? getc(overlayFile) : padValue, outputFile); offset++; } - /* Output the section itself */ + // Output the section itself fwrite(section->data, sizeof(*section->data), section->size, outputFile); if (overlayFile) { - /* Skip bytes even with pipes */ + // Skip bytes even with pipes for (uint16_t i = 0; i < section->size; i++) getc(overlayFile); } @@ -231,9 +231,7 @@ static void writeBank(struct SortedSection *bankSections, uint16_t baseOffset, } } -/** - * Writes a ROM file to the output. - */ +// Writes a ROM file to the output. static void writeROM(void) { outputFile = openFile(outputFileName, "wb"); @@ -258,7 +256,7 @@ static void writeROM(void) closeFile(overlayFile); } -/** +/* * Get the lowest section by address out of the two * @param s1 One choice * @param s2 The other @@ -275,10 +273,8 @@ static struct SortedSection const **nextSection(struct SortedSection const **s1, return (*s1)->section->org < (*s2)->section->org ? s1 : s2; } -/* - * Comparator function for `qsort` to sort symbols - * Symbols are ordered by address, or else by original index for a stable sort - */ +// Comparator function for `qsort` to sort symbols +// Symbols are ordered by address, or else by original index for a stable sort static int compareSymbols(void const *a, void const *b) { struct SortedSymbol const *sym1 = (struct SortedSymbol const *)a; @@ -290,7 +286,7 @@ static int compareSymbols(void const *a, void const *b) return sym1->idx < sym2->idx ? -1 : sym1->idx > sym2->idx ? 1 : 0; } -/** +/* * Write a bank's contents to the sym file * @param bankSections The bank's sections */ @@ -357,7 +353,7 @@ static void writeSymBank(struct SortedSections const *bankSections, free(symList); } -/** +/* * Write a bank's contents to the map file * @param bankSections The bank's sections * @return The bank's used space @@ -445,7 +441,7 @@ static uint16_t writeMapBank(struct SortedSections const *sectList, return used; } -/** +/* * Write the total used space by section type to the map file * @param usedMap The total used space by section type */ @@ -471,9 +467,7 @@ static void writeMapUsed(uint32_t usedMap[MIN_NB_ELMS(SECTTYPE_INVALID)]) } } -/** - * Writes the sym and/or map files, if applicable. - */ +// Writes the sym and/or map files, if applicable. static void writeSymAndMap(void) { if (!symFileName && !mapFileName) diff --git a/src/link/patch.c b/src/link/patch.c index 2b9fd326..83cb1477 100644 --- a/src/link/patch.c +++ b/src/link/patch.c @@ -63,11 +63,9 @@ static void pushRPN(int32_t value, bool comesFromError) realloc(stack.values, sizeof(*stack.values) * stack.capacity); stack.errorFlags = realloc(stack.errorFlags, sizeof(*stack.errorFlags) * stack.capacity); - /* - * Static analysis tools complain that the capacity might become - * zero due to overflow, but fail to realize that it's caught by - * the overflow check above. Hence the stringent check below. - */ + // Static analysis tools complain that the capacity might become + // zero due to overflow, but fail to realize that it's caught by + // the overflow check above. Hence the stringent check below. if (!stack.values || !stack.errorFlags || !stack.capacity) err("Failed to resize RPN stack"); } @@ -97,7 +95,7 @@ static void freeRPNStack(void) free(stack.errorFlags); } -/* RPN operators */ +// RPN operators static uint32_t getRPNByte(uint8_t const **expression, int32_t *size, struct FileStackNode const *node, uint32_t lineNo) @@ -111,17 +109,17 @@ static uint32_t getRPNByte(uint8_t const **expression, int32_t *size, static struct Symbol const *getSymbol(struct Symbol const * const *symbolList, uint32_t index) { - assert(index != (uint32_t)-1); /* PC needs to be handled specially, not here */ + assert(index != (uint32_t)-1); // PC needs to be handled specially, not here struct Symbol const *symbol = symbolList[index]; - /* If the symbol is defined elsewhere... */ + // If the symbol is defined elsewhere... if (symbol->type == SYMTYPE_IMPORT) return sym_GetSymbol(symbol->name); return symbol; } -/** +/* * Compute a patch's value from its RPN string. * @param patch The patch to compute the value of * @param section The section the patch is contained in @@ -132,7 +130,7 @@ static struct Symbol const *getSymbol(struct Symbol const * const *symbolList, static int32_t computeRPNExpr(struct Patch const *patch, struct Symbol const * const *fileSymbols) { -/* Small shortcut to avoid a lot of repetition */ +// Small shortcut to avoid a lot of repetition #define popRPN() popRPN(patch->src, patch->lineNo) uint8_t const *expression = patch->rpnExpression; @@ -147,13 +145,10 @@ static int32_t computeRPNExpr(struct Patch const *patch, isError = false; - /* - * Friendly reminder: - * Be VERY careful with two `popRPN` in the same expression. - * C does not guarantee order of evaluation of operands!! - * So, if there are two `popRPN` in the same expression, make - * sure the operation is commutative. - */ + // Be VERY careful with two `popRPN` in the same expression. + // C does not guarantee order of evaluation of operands!! + // So, if there are two `popRPN` in the same expression, make + // sure the operation is commutative. switch (command) { struct Symbol const *symbol; char const *name; @@ -295,11 +290,9 @@ static int32_t computeRPNExpr(struct Patch const *patch, break; case RPN_BANK_SECT: - /* - * `expression` is not guaranteed to be '\0'-terminated. If it is not, - * `getRPNByte` will have a fatal internal error. - * In either case, `getRPNByte` will not free `expression`. - */ + // `expression` is not guaranteed to be '\0'-terminated. If it is not, + // `getRPNByte` will have a fatal internal error. + // In either case, `getRPNByte` will not free `expression`. name = (char const *)expression; while (getRPNByte(&expression, &size, patch->src, patch->lineNo)) ; @@ -329,7 +322,7 @@ static int32_t computeRPNExpr(struct Patch const *patch, break; case RPN_SIZEOF_SECT: - /* This has assumptions commented in the `RPN_BANK_SECT` case above. */ + // This has assumptions commented in the `RPN_BANK_SECT` case above. name = (char const *)expression; while (getRPNByte(&expression, &size, patch->src, patch->lineNo)) ; @@ -348,7 +341,7 @@ static int32_t computeRPNExpr(struct Patch const *patch, break; case RPN_STARTOF_SECT: - /* This has assumptions commented in the `RPN_BANK_SECT` case above. */ + // This has assumptions commented in the `RPN_BANK_SECT` case above. name = (char const *)expression; while (getRPNByte(&expression, &size, patch->src, patch->lineNo)) ; @@ -381,9 +374,8 @@ static int32_t computeRPNExpr(struct Patch const *patch, case RPN_RST: value = popRPN(); - /* Acceptable values are 0x00, 0x08, 0x10, ..., 0x38 - * They can be easily checked with a bitmask - */ + // Acceptable values are 0x00, 0x08, 0x10, ..., 0x38 + // They can be easily checked with a bitmask if (value & ~0x38) { if (!isError) error(patch->src, patch->lineNo, @@ -406,7 +398,7 @@ static int32_t computeRPNExpr(struct Patch const *patch, value |= getRPNByte(&expression, &size, patch->src, patch->lineNo) << shift; - if (value == -1) { /* PC */ + if (value == -1) { // PC if (!patch->pcSection) { error(patch->src, patch->lineNo, "PC has no value outside a section"); @@ -424,7 +416,7 @@ static int32_t computeRPNExpr(struct Patch const *patch, isError = true; } else { value = symbol->value; - /* Symbols attached to sections have offsets */ + // Symbols attached to sections have offsets if (symbol->section) value += symbol->section->org; } @@ -461,8 +453,8 @@ void patch_CheckAssertions(struct Assertion *assert) fatal(assert->patch.src, assert->patch.lineNo, "%s", assert->message[0] ? assert->message : "assert failure"); - /* Not reached */ - break; /* Here so checkpatch doesn't complain */ + // Not reached + break; // Here so checkpatch doesn't complain case ASSERT_ERROR: error(assert->patch.src, assert->patch.lineNo, "%s", assert->message[0] ? assert->message @@ -491,7 +483,7 @@ void patch_CheckAssertions(struct Assertion *assert) freeRPNStack(); } -/** +/* * Applies all of a section's patches * @param section The section to patch * @param arg Ignored callback arg @@ -506,7 +498,7 @@ static void applyFilePatches(struct Section *section, struct Section *dataSectio section->fileSymbols); uint16_t offset = patch->offset + section->offset; - /* `jr` is quite unlike the others... */ + // `jr` is quite unlike the others... if (patch->type == PATCHTYPE_JR) { // Offset is relative to the byte *after* the operand // PC as operand to `jr` is lower than reference PC by 2 @@ -519,7 +511,7 @@ static void applyFilePatches(struct Section *section, struct Section *dataSectio jumpOffset); dataSection->data[offset] = jumpOffset & 0xFF; } else { - /* Patch a certain number of bytes */ + // Patch a certain number of bytes struct { uint8_t size; int32_t min; @@ -544,7 +536,7 @@ static void applyFilePatches(struct Section *section, struct Section *dataSectio } } -/** +/* * Applies all of a section's patches, iterating over "components" of * unionized sections * @param section The section to patch diff --git a/src/link/script.c b/src/link/script.c index 97c43422..ebd4ca98 100644 --- a/src/link/script.c +++ b/src/link/script.c @@ -41,7 +41,7 @@ static void pushFile(char *newFileName) linkerScriptName, lineNo); if (fileStackIndex == fileStackSize) { - if (!fileStackSize) /* Init file stack */ + if (!fileStackSize) // Init file stack fileStackSize = 4; fileStackSize *= 2; fileStack = realloc(fileStack, sizeof(*fileStack) * fileStackSize); @@ -88,7 +88,7 @@ static bool isNewline(int c) return c == '\r' || c == '\n'; } -/** +/* * Try parsing a number, in base 16 if it begins with a dollar, * in base 10 otherwise * @param str The number to parse @@ -108,7 +108,7 @@ static bool tryParseNumber(char const *str, uint32_t *number) base = 16; } - /* An empty string is not a number */ + // An empty string is not a number if (!*str) return false; @@ -188,16 +188,16 @@ static struct LinkerScriptToken *nextToken(void) static struct LinkerScriptToken token; int curchar; - /* If the token has a string, make sure to avoid leaking it */ + // If the token has a string, make sure to avoid leaking it if (token.type == TOKEN_STRING) free(token.attr.string); - /* Skip initial whitespace... */ + // Skip initial whitespace... do curchar = nextChar(); while (isWhiteSpace(curchar)); - /* If this is a comment, skip to the end of the line */ + // If this is a comment, skip to the end of the line if (curchar == ';') { do { curchar = nextChar(); @@ -207,22 +207,22 @@ static struct LinkerScriptToken *nextToken(void) if (curchar == EOF) { token.type = TOKEN_EOF; } else if (isNewline(curchar)) { - /* If we have a newline char, this is a newline token */ + // If we have a newline char, this is a newline token token.type = TOKEN_NEWLINE; if (curchar == '\r') { - /* Handle CRLF */ + // Handle CRLF curchar = nextChar(); if (curchar != '\n') ungetc(curchar, linkerScript); } } else if (curchar == '"') { - /* If we have a string start, this is a string */ + // If we have a string start, this is a string token.type = TOKEN_STRING; - token.attr.string = NULL; /* Force initial alloc */ + token.attr.string = NULL; // Force initial alloc size_t size = 0; - size_t capacity = 16; /* Half of the default capacity */ + size_t capacity = 16; // Half of the default capacity do { curchar = nextChar(); @@ -230,10 +230,10 @@ static struct LinkerScriptToken *nextToken(void) errx("%s(%" PRIu32 "): Unterminated string", linkerScriptName, lineNo); } else if (curchar == '"') { - /* Quotes force a string termination */ + // Quotes force a string termination curchar = '\0'; } else if (curchar == '\\') { - /* Backslashes are escape sequences */ + // Backslashes are escape sequences curchar = nextChar(); if (curchar == EOF || isNewline(curchar)) errx("%s(%" PRIu32 "): Unterminated string", @@ -259,10 +259,10 @@ static struct LinkerScriptToken *nextToken(void) token.attr.string[size++] = curchar; } while (curchar); } else { - /* This is either a number, command or bank, that is: a word */ + // This is either a number, command or bank, that is: a word char *str = NULL; size_t size = 0; - size_t capacity = 8; /* Half of the default capacity */ + size_t capacity = 8; // Half of the default capacity for (;;) { if (size >= capacity || str == NULL) { @@ -279,7 +279,7 @@ static struct LinkerScriptToken *nextToken(void) break; curchar = nextChar(); - /* Whitespace, a newline or a comment end the token */ + // Whitespace, a newline or a comment end the token if (isWhiteSpace(curchar) || isNewline(curchar) || curchar == ';') { ungetc(curchar, linkerScript); curchar = '\0'; @@ -288,7 +288,7 @@ static struct LinkerScriptToken *nextToken(void) token.type = TOKEN_INVALID; - /* Try to match a command */ + // Try to match a command for (enum LinkerScriptCommand i = 0; i < COMMAND_INVALID; i++) { if (!strcmp(commands[i], str)) { token.type = TOKEN_COMMAND; @@ -298,7 +298,7 @@ static struct LinkerScriptToken *nextToken(void) } if (token.type == TOKEN_INVALID) { - /* Try to match a bank specifier */ + // Try to match a bank specifier for (enum SectionType type = 0; type < SECTTYPE_INVALID; type++) { if (!strcmp(sectionTypeInfo[type].name, str)) { token.type = TOKEN_BANK; @@ -309,13 +309,13 @@ static struct LinkerScriptToken *nextToken(void) } if (token.type == TOKEN_INVALID) { - /* Try to match an include token */ + // Try to match an include token if (!strcmp("INCLUDE", str)) token.type = TOKEN_INCLUDE; } if (token.type == TOKEN_INVALID) { - /* None of the strings matched, do we have a number? */ + // None of the strings matched, do we have a number? if (tryParseNumber(str, &token.attr.number)) token.type = TOKEN_NUMBER; else @@ -354,14 +354,14 @@ static void processCommand(enum LinkerScriptCommand command, uint16_t arg, uint1 enum LinkerScriptParserState { PARSER_FIRSTTIME, PARSER_LINESTART, - PARSER_INCLUDE, /* After an INCLUDE token */ + PARSER_INCLUDE, // After an INCLUDE token PARSER_LINEEND }; -/* Part of internal state, but has data that needs to be freed */ +// Part of internal state, but has data that needs to be freed static uint16_t *curaddr[SECTTYPE_INVALID]; -/* Put as global to ensure it's initialized only once */ +// Put as global to ensure it's initialized only once static enum LinkerScriptParserState parserState = PARSER_FIRSTTIME; struct SectionPlacement *script_NextSection(void) @@ -373,7 +373,7 @@ struct SectionPlacement *script_NextSection(void) if (parserState == PARSER_FIRSTTIME) { lineNo = 1; - /* Init PC for all banks */ + // Init PC for all banks for (enum SectionType i = 0; i < SECTTYPE_INVALID; i++) { curaddr[i] = malloc(sizeof(*curaddr[i]) * nbbanks(i)); for (uint32_t b = 0; b < nbbanks(i); b++) @@ -427,7 +427,7 @@ struct SectionPlacement *script_NextSection(void) lineNo++; break; - /* A stray string is a section name */ + // A stray string is a section name case TOKEN_STRING: parserState = PARSER_LINEEND; @@ -454,15 +454,11 @@ struct SectionPlacement *script_NextSection(void) token = nextToken(); hasArg = token->type == TOKEN_NUMBER; - /* - * Leaving `arg` uninitialized when `!hasArg` - * causes GCC to warn about its use as an - * argument to `processCommand`. This cannot - * happen because `hasArg` has to be true, but - * silence the warning anyways. - * I dislike doing this because it could swallow - * actual errors, but I don't have a choice. - */ + // Leaving `arg` uninitialized when `!hasArg` causes GCC to warn + // about its use as an argument to `processCommand`. This cannot + // happen because `hasArg` has to be true, but silence the warning + // anyways. I dislike doing this because it could swallow actual + // errors, but I don't have a choice. arg = hasArg ? token->attr.number : 0; if (tokType == TOKEN_COMMAND) { @@ -474,12 +470,10 @@ struct SectionPlacement *script_NextSection(void) linkerScriptName, lineNo); processCommand(attr.command, arg, &curaddr[placement.type][bankID]); - } else { /* TOKEN_BANK */ + } else { // TOKEN_BANK placement.type = attr.secttype; - /* - * If there's only one bank, - * specifying the number is optional. - */ + // If there's only one bank, + // specifying the number is optional. if (!hasArg && nbbanks(placement.type) != 1) errx("%s(%" PRIu32 "): Didn't specify a bank number", linkerScriptName, lineNo); @@ -497,7 +491,7 @@ struct SectionPlacement *script_NextSection(void) bankID = arg - sectionTypeInfo[placement.type].firstBank; } - /* If we read a token we shouldn't have... */ + // If we read a token we shouldn't have... if (token->type != TOKEN_NUMBER) goto lineend; break; @@ -513,9 +507,9 @@ struct SectionPlacement *script_NextSection(void) errx("%s(%" PRIu32 "): Expected a file name after INCLUDE", linkerScriptName, lineNo); - /* Switch to that file */ + // Switch to that file pushFile(token->attr.string); - /* The file stack took ownership of the string */ + // The file stack took ownership of the string token->attr.string = NULL; parserState = PARSER_LINESTART; diff --git a/src/link/sdas_obj.c b/src/link/sdas_obj.c index 1934e940..d6480f87 100644 --- a/src/link/sdas_obj.c +++ b/src/link/sdas_obj.c @@ -1,3 +1,10 @@ +/* + * This file is part of RGBDS. + * + * Copyright (c) 2022, Eldred Habert and RGBDS contributors. + * + * SPDX-License-Identifier: MIT + */ #include #include diff --git a/src/link/section.c b/src/link/section.c index 265c4fdb..4b7e9367 100644 --- a/src/link/section.c +++ b/src/link/section.c @@ -166,7 +166,7 @@ static void mergeSections(struct Section *target, struct Section *other, enum Se // `data` pointer, or a size of 0. if (other->data) { if (target->data) { - /* Ensure we're not allocating 0 bytes */ + // Ensure we're not allocating 0 bytes target->data = realloc(target->data, sizeof(*target->data) * target->size + 1); if (!target->data) @@ -177,7 +177,7 @@ static void mergeSections(struct Section *target, struct Section *other, enum Se target->data = other->data; other->data = NULL; // Prevent a double free() } - /* Adjust patches' PC offsets */ + // Adjust patches' PC offsets for (uint32_t patchID = 0; patchID < other->nbPatches; patchID++) other->patches[patchID].pcOffset += other->offset; } else if (target->data) { @@ -195,7 +195,7 @@ static void mergeSections(struct Section *target, struct Section *other, enum Se void sect_AddSection(struct Section *section) { - /* Check if the section already exists */ + // Check if the section already exists struct Section *other = hash_GetElement(sections, section->name); if (other) { @@ -210,7 +210,7 @@ void sect_AddSection(struct Section *section) errx("Section \"%s\" is of type %s, which cannot be unionized", section->name, sectionTypeInfo[section->type].name); } else { - /* If not, add it */ + // If not, add it hash_AddElement(sections, section->name, section); } } @@ -229,7 +229,7 @@ static void doSanityChecks(struct Section *section, void *ptr) { (void)ptr; - /* Sanity check the section's type */ + // Sanity check the section's type if (section->type < 0 || section->type >= SECTTYPE_INVALID) { error(NULL, 0, "Section \"%s\" has an invalid type", section->name); @@ -254,14 +254,12 @@ static void doSanityChecks(struct Section *section, void *ptr) error(NULL, 0, "%s: VRAM bank 1 can't be used with option -d", section->name); - /* - * Check if alignment is reasonable, this is important to avoid UB - * An alignment of zero is equivalent to no alignment, basically - */ + // Check if alignment is reasonable, this is important to avoid UB + // An alignment of zero is equivalent to no alignment, basically if (section->isAlignFixed && section->alignMask == 0) section->isAlignFixed = false; - /* Too large an alignment may not be satisfiable */ + // Too large an alignment may not be satisfiable if (section->isAlignFixed && (section->alignMask & sectionTypeInfo[section->type].startAddr)) error(NULL, 0, "%s: %s sections cannot be aligned to $%04x bytes", section->name, sectionTypeInfo[section->type].name, section->alignMask + 1); @@ -274,12 +272,12 @@ static void doSanityChecks(struct Section *section, void *ptr) : "Cannot place section \"%s\" in bank %" PRIu32 ", it must be between %" PRIu32 " and %" PRIu32, section->name, section->bank, minbank, maxbank); - /* Check if section has a chance to be placed */ + // Check if section has a chance to be placed if (section->size > sectionTypeInfo[section->type].size) error(NULL, 0, "Section \"%s\" is bigger than the max size for that type: %#" PRIx16 " > %#" PRIx16, section->name, section->size, sectionTypeInfo[section->type].size); - /* Translate loose constraints to strong ones when they're equivalent */ + // Translate loose constraints to strong ones when they're equivalent if (minbank == maxbank) { section->bank = minbank; @@ -287,7 +285,7 @@ static void doSanityChecks(struct Section *section, void *ptr) } if (section->isAddressFixed) { - /* It doesn't make sense to have both org and alignment set */ + // It doesn't make sense to have both org and alignment set if (section->isAlignFixed) { if ((section->org & section->alignMask) != section->alignOfs) error(NULL, 0, "Section \"%s\"'s fixed address doesn't match its alignment", @@ -295,7 +293,7 @@ static void doSanityChecks(struct Section *section, void *ptr) section->isAlignFixed = false; } - /* Ensure the target address is valid */ + // Ensure the target address is valid if (section->org < sectionTypeInfo[section->type].startAddr || section->org > endaddr(section->type)) error(NULL, 0, "Section \"%s\"'s fixed address %#" PRIx16 " is outside of range [%#" diff --git a/src/link/symbol.c b/src/link/symbol.c index 52c77339..c270c8fc 100644 --- a/src/link/symbol.c +++ b/src/link/symbol.c @@ -40,7 +40,7 @@ void sym_ForEach(void (*callback)(struct Symbol *, void *), void *arg) void sym_AddSymbol(struct Symbol *symbol) { - /* Check if the symbol already exists */ + // Check if the symbol already exists struct Symbol *other = hash_GetElement(symbols, symbol->name); if (other) { @@ -53,7 +53,7 @@ void sym_AddSymbol(struct Symbol *symbol) exit(1); } - /* If not, add it */ + // If not, add it hash_AddElement(symbols, symbol->name, symbol); } diff --git a/src/linkdefs.c b/src/linkdefs.c index 2765f642..337603ee 100644 --- a/src/linkdefs.c +++ b/src/linkdefs.c @@ -1,3 +1,10 @@ +/* + * This file is part of RGBDS. + * + * Copyright (c) 2022, RGBDS contributors. + * + * SPDX-License-Identifier: MIT + */ #include "linkdefs.h" diff --git a/src/opmath.c b/src/opmath.c index 11d1ea56..f5832ddb 100644 --- a/src/opmath.c +++ b/src/opmath.c @@ -6,9 +6,7 @@ * SPDX-License-Identifier: MIT */ -/* - * Mathematical operators that don't reuse C's behavior - */ +// Mathematical operators that don't reuse C's behavior #include diff --git a/test/gfx/rgbgfx_test.cpp b/test/gfx/rgbgfx_test.cpp index a7dbb3da..5a2c51f9 100644 --- a/test/gfx/rgbgfx_test.cpp +++ b/test/gfx/rgbgfx_test.cpp @@ -1,3 +1,10 @@ +/* + * This file is part of RGBDS. + * + * Copyright (c) 2022, Eldred Habert and RGBDS contributors. + * + * SPDX-License-Identifier: MIT + */ // For `execProg` (Windows is its special little snowflake again) #if !defined(_MSC_VER) && !defined(__MINGW32__) @@ -125,7 +132,7 @@ public: Rgba const &pixel(uint32_t x, uint32_t y) const { return pixels[y * width + x]; } - /** + /* * Reads a PNG and notes all of its colors * * This code is more complicated than strictly necessary, but that's because of the API @@ -298,7 +305,7 @@ static char *execProg(char const *name, char * const *argv) { fatal("%s returned with status %d", name, info.si_status); } -#else /* defined(_MSC_VER) || defined(__MINGW32__) */ +#else // defined(_MSC_VER) || defined(__MINGW32__) auto winStrerror = [](DWORD errnum) { LPTSTR buf;