UEFIStarter
a simple UEFI framework
Todo List
Global _get_next_free_entry (memory_page_list_t **page_list, UINTN *index)
if there's a next page_list, check that. if not, allocate new page_list and link to it
Global _parse_glyph_data (UINT8 *data, image_t *image, unsigned int left, unsigned int top)
this currently only reads the red color channel, the source image should be grayscale anyway. Could check or average all channels just to be safe.
Global _print_argument_group_help (cmdline_argument_group_t *arguments)

could mind required parameters (currently numbers for double/int args) for pad length, then remove typetext padding in Print() below

combine pad length for different groups that were combined, e.g. builtin and custom audio options

Global _wcstof (CHAR16 *str)
replace _wcstof() with built-in, or move to separate file
Global _wctype_number (CHAR16 *string, BOOLEAN allow_decimal)
the wctype* functions should be replaced by a built-in, or moved to a separate lib
File ac97.c
could add double-rate audio support
File ac97.h
maybe combine find and init functions
Class ac97_buffers_s16_t
ac97_buffers_s16_t.buffers doesn't need to be DMA transferred, change this to e.g. an output of init_buffers()
Global draw_image (EFI_GRAPHICS_OUTPUT_PROTOCOL *gop, CHAR16 *filename, image_parser_f parser)
remove parser function pointer and use newer load_netpbm_file() instead
Global draw_text (SPRITE buffer, UINTN buffer_width, glyph_list_t *glyphs, UINT32 x, UINT32 y, COLOR color, CHAR16 *text)
warn about exceeding width, then either do a line break or clip current line
Global find_device (EFI_GUID *guid, unsigned int offset)
extract to lib and rename to open_protocol()
Global find_pci_device_name (UINT16 vendor_id, UINT16 device_id, UINT16 subvendor_id, UINT16 subdevice_id)
later: implement sub IDs.
Global ftowcs (double value)
make number of decimals configurable
Global get_file_contents (CHAR16 *filename)
start a list of pitfalls, e.g. this: bufsize was too small (unsigned int instead of UINTN), so this call changed the last declared uninitialized variable in this function
Global get_timestamp ()
this could be made inline for improved timing accuracy
Global init (INTN argc, CHAR16 **argv, UINTN arg_group_count,...)
could add cmdline arg
Global init_flake (flake_t *flake, int time_offset)
use screen height and max cross speed to accurately calculate this
File pci.c
read classes and subclasses from pci.ids
Global print_status (CHAR16 *function, EFI_STATUS code)
check if this function is still required
Global random ()
There's a GetRandomNumber32() function in EDK2 but it seems to segfault all the time, see what's up
Global stop_tracking_memory ()
the free_pool_memory_entries() call was at the end of this function - make sure there aren't any side-effects from calling this before the NULL check below
Global test_get_file_contents ()
read a file that's guaranteed to exist, e.g. the currently running .efi, instead of startup.nsh.
Global test_graphics ()
move this to the graphics tests, once they're in this repository
File tests.c

add pause-on-error/incomplete feature

could add a way to capture error messages and output them later

Global timestamp_diff_seconds (UINT64 start, UINT64 end)
this doesn't check for division by 0 errors on purpose, maybe check performance hit and add it if insignificant
Global track_pool_memory (void *address)
implement linked list for pool memory tracking