Skip to content

Commit

Permalink
Implement droidboot_strtol
Browse files Browse the repository at this point in the history
  • Loading branch information
luka177 committed Oct 1, 2023
1 parent 90f303c commit e3c4268
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 9 deletions.
74 changes: 74 additions & 0 deletions common/droidboot_stdfunc.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,77 @@ unsigned int droidboot_atoi(char* str)
// return result.
return res;
}

#define LONG_MAX ((long)(~0UL>>1))
#define LONG_MIN (~LONG_MAX)
int isspace(int c); /* <-- Forward declare from <ctype.h> */

long droidboot_strtol(const char *restrict nptr, char **restrict endptr, int base) {
const char *p = nptr, *endp;
_Bool is_neg = 0, overflow = 0;
/* Need unsigned so (-LONG_MIN) can fit in these: */
unsigned long n = 0UL, cutoff;
int cutlim;
if (base < 0 || base == 1 || base > 36) {
return 0L;
}
endp = nptr;
while (isspace(*p))
p++;
if (*p == '+') {
p++;
} else if (*p == '-') {
is_neg = 1, p++;
}
if (*p == '0') {
p++;
/* For strtol(" 0xZ", &endptr, 16), endptr should point to 'x';
* pointing to ' ' or '0' is non-compliant.
* (Many implementations do this wrong.) */
endp = p;
if (base == 16 && (*p == 'X' || *p == 'x')) {
p++;
} else if (base == 2 && (*p == 'B' || *p == 'b')) {
/* C23 standard supports "0B" and "0b" prefixes. */
p++;
} else if (base == 0) {
if (*p == 'X' || *p == 'x') {
base = 16, p++;
} else if (*p == 'B' || *p == 'b') {
base = 2, p++;
} else {
base = 8;
}
}
} else if (base == 0) {
base = 10;
}
cutoff = (is_neg) ? -(LONG_MIN / base) : LONG_MAX / base;
cutlim = (is_neg) ? -(LONG_MIN % base) : LONG_MAX % base;
while (1) {
int c;
if (*p >= 'A')
c = ((*p - 'A') & (~('a' ^ 'A'))) + 10;
else if (*p <= '9')
c = *p - '0';
else
break;
if (c < 0 || c >= base) break;
endp = ++p;
if (overflow) {
/* endptr should go forward and point to the non-digit character
* (of the given base); required by ANSI standard. */
if (endptr) continue;
break;
}
if (n > cutoff || (n == cutoff && c > cutlim)) {
overflow = 1; continue;
}
n = n * base + c;
}
if (endptr) *endptr = (char *)endp;
if (overflow) {
return ((is_neg) ? LONG_MIN : LONG_MAX);
}
return (long)((is_neg) ? -n : n);
}
18 changes: 9 additions & 9 deletions config_parser/droidboot_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,31 +303,31 @@ int parse_global_config(struct global_config *global_config) {
char *bg_color = NULL;
ret = config_parse_option(&bg_color, "bg_color", (const char *)buf);
if(ret<0) global_config->bg_color = 0x000000;
else global_config->bg_color = strtoul(bg_color, NULL, 16);
else global_config->bg_color = droidboot_strtol(bg_color, NULL, 16);

// Button color
char *button_color = NULL;
ret = config_parse_option(&button_color, "button_color", (const char *)buf);
if(ret<0) global_config->button_color = 0x000000;
else global_config->button_color = strtoul(button_color, NULL, 16);
else global_config->button_color = droidboot_strtol(button_color, NULL, 16);

// Button text color
char *button_text_color = NULL;
ret = config_parse_option(&button_text_color, "button_text_color", (const char *)buf);
if(ret<0) global_config->button_text_color = 0xffffff;
else global_config->button_text_color = strtoul(button_text_color, NULL, 16);
else global_config->button_text_color = droidboot_strtol(button_text_color, NULL, 16);

// Button selected color
char *button_selected_color = NULL;
ret = config_parse_option(&button_selected_color, "button_selected_color", (const char *)buf);
if(ret<0) global_config->button_selected_color = 0xff9800;
else global_config->button_selected_color = strtoul(button_selected_color, NULL, 16);
else global_config->button_selected_color = droidboot_strtol(button_selected_color, NULL, 16);

// Button selected text color
char *button_selected_text_color = NULL;
ret = config_parse_option(&button_selected_text_color, "button_selected_text_color", (const char *)buf);
if(ret<0) global_config->button_selected_text_color = 0x000000;
else global_config->button_selected_text_color = strtoul(button_selected_text_color, NULL, 16);
else global_config->button_selected_text_color = droidboot_strtol(button_selected_text_color, NULL, 16);

// Border width
char *border_width = NULL;
Expand All @@ -339,13 +339,13 @@ int parse_global_config(struct global_config *global_config) {
char *border_color = NULL;
ret = config_parse_option(&border_color, "border_color", (const char *)buf);
if(ret<0) global_config->border_color = 0xffffff;
else global_config->border_color = strtoul(border_color, NULL, 16);
else global_config->border_color = droidboot_strtol(border_color, NULL, 16);

// Border selected color
char *border_selected_color = NULL;
ret = config_parse_option(&border_selected_color, "border_selected_color", (const char *)buf);
if(ret<0) global_config->border_selected_color = 0xffffff;
else global_config->border_selected_color = strtoul(border_selected_color, NULL, 16);
else global_config->border_selected_color = droidboot_strtol(border_selected_color, NULL, 16);

// Button border width
char *button_border_width = NULL;
Expand All @@ -357,13 +357,13 @@ int parse_global_config(struct global_config *global_config) {
char *button_border_color = NULL;
ret = config_parse_option(&button_border_color, "button_border_color", (const char *)buf);
if(ret<0) global_config->button_border_color = 0xffffff;
else global_config->button_border_color = strtoul(button_border_color, NULL, 16);
else global_config->button_border_color = droidboot_strtol(button_border_color, NULL, 16);

// Button border selected color
char *button_border_selected_color = NULL;
ret = config_parse_option(&button_border_selected_color, "button_border_selected_color", (const char *)buf);
if(ret<0) global_config->button_border_selected_color = 0xffffff;
else global_config->button_border_selected_color = strtoul(button_border_selected_color, NULL, 16);
else global_config->button_border_selected_color = droidboot_strtol(button_border_selected_color, NULL, 16);

// Radius
char *radius = NULL;
Expand Down
1 change: 1 addition & 0 deletions include/droidboot_stdfunc.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#pragma once
// internal ASCII string to unsigned int conversion
unsigned int droidboot_atoi(const char ** str);
long droidboot_strtol(const char *restrict nptr, char **restrict endptr, int base);

0 comments on commit e3c4268

Please sign in to comment.