return path;
}
-void mangle_stub_cmdline(char16_t *cmdline) {
- char16_t *p = cmdline;
+static bool shall_be_whitespace(char16_t c) {
+ return c <= 0x20U || c == 0x7FU; /* All control characters + space */
+}
+
+char16_t* mangle_stub_cmdline(char16_t *cmdline) {
+ char16_t *p, *q, *e;
if (!cmdline)
- return;
+ return cmdline;
- for (; *cmdline != '\0'; cmdline++)
- /* Convert ASCII control characters to spaces. */
- if (*cmdline <= 0x1F)
- *cmdline = ' ';
+ p = q = cmdline;
- /* chomp the trailing whitespaces */
- while (cmdline != p) {
- --cmdline;
+ /* Skip initial whitespace */
+ while (shall_be_whitespace(*p))
+ p++;
- if (*cmdline != ' ')
- break;
+ /* Turn inner control characters into proper spaces */
+ for (e = p; *p != 0; p++) {
+ if (shall_be_whitespace(*p)) {
+ *(q++) = ' ';
+ continue;
+ }
- *cmdline = '\0';
+ *(q++) = *p;
+ e = q; /* remember last non-whitespace char */
}
+
+ /* Chop off trailing whitespace */
+ *e = 0;
+ return cmdline;
}
EFI_STATUS chunked_read(EFI_FILE *file, size_t *size, void *buf) {
void convert_efi_path(char16_t *path);
char16_t *xstr8_to_path(const char *stra);
-void mangle_stub_cmdline(char16_t *cmdline);
+char16_t *mangle_stub_cmdline(char16_t *cmdline);
EFI_STATUS chunked_read(EFI_FILE *file, size_t *size, void *buf);
EFI_STATUS file_read(EFI_FILE *dir, const char16_t *name, size_t off, size_t size, char **content, size_t *content_size);