[hci] Use dynamically allocated buffers for editable strings

Editable strings currently require a fixed-size buffer, which is
inelegant and limits the potential for creating interactive forms with
a variable number of edit box widgets.

Remove this limitation by switching to using a dynamically allocated
buffer for editable strings and edit box widgets.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2024-04-15 15:59:49 +01:00
parent 27ecc36c0b
commit 40b5112440
8 changed files with 199 additions and 142 deletions

View File

@@ -36,7 +36,7 @@ enum edit_box_flags {
EDITBOX_STARS = 0x0001,
};
extern void init_editbox ( struct edit_box *box, char *buf, size_t len,
extern void init_editbox ( struct edit_box *box, char **buf,
WINDOW *win, unsigned int row, unsigned int col,
unsigned int width, unsigned int flags )
__attribute__ (( nonnull (1, 2) ));

View File

@@ -11,10 +11,8 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
/** An editable string */
struct edit_string {
/** Buffer for string */
char *buf;
/** Size of buffer (including terminating NUL) */
size_t len;
/** Dynamically allocated string buffer */
char **buf;
/** Cursor position */
unsigned int cursor;
@@ -32,17 +30,28 @@ struct edit_string {
* Initialise editable string
*
* @v string Editable string
* @v buf Buffer for string
* @v len Length of buffer
* @v buf Dynamically allocated string buffer
*
* The @c buf parameter must be the address of a caller-provided
* pointer to a NUL-terminated string allocated using malloc() (or
* equivalent, such as strdup()). Any edits made to the string will
* realloc() the string buffer as needed.
*
* The caller may choose leave the initial string buffer pointer as @c
* NULL, in which case it will be allocated upon the first attempt to
* insert a character into the buffer. If the caller does this, then
* it must be prepared to find the pointer still @c NULL after
* editing, since the user may never attempt to insert any characters.
*/
static inline void init_editstring ( struct edit_string *string, char *buf,
size_t len ) {
static inline __nonnull void init_editstring ( struct edit_string *string,
char **buf ) {
string->buf = buf;
string->len = len;
}
extern void replace_string ( struct edit_string *string,
const char *replacement ) __nonnull;
extern int edit_string ( struct edit_string *string, int key ) __nonnull;
extern __attribute__ (( nonnull ( 1 ) )) int
replace_string ( struct edit_string *string, const char *replacement );
extern __nonnull int edit_string ( struct edit_string *string, int key );
#endif /* _IPXE_EDITSTRING_H */

View File

@@ -416,6 +416,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#define ERRFILE_efi_settings ( ERRFILE_OTHER | 0x005e0000 )
#define ERRFILE_x25519 ( ERRFILE_OTHER | 0x005f0000 )
#define ERRFILE_des ( ERRFILE_OTHER | 0x00600000 )
#define ERRFILE_editstring ( ERRFILE_OTHER | 0x00610000 )
/** @} */