From d3803d0d05f520adb70f6c255e272d28d873ea3a Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 14 Jun 2015 19:22:22 +0200 Subject: [PATCH] (platform_linux.c) Use hashing --- frontend/drivers/platform_linux.c | 130 ++++++++++++++++++++---------- 1 file changed, 86 insertions(+), 44 deletions(-) diff --git a/frontend/drivers/platform_linux.c b/frontend/drivers/platform_linux.c index 44e9ee4657..928bfcecab 100644 --- a/frontend/drivers/platform_linux.c +++ b/frontend/drivers/platform_linux.c @@ -14,8 +14,6 @@ * If not, see . */ -#include "../frontend_driver.h" - #include #include #include @@ -27,7 +25,11 @@ #include #include #include + #include +#include + +#include "../frontend_driver.h" static const char *proc_apm_path = "/proc/apm"; static const char *proc_acpi_battery_path = "/proc/acpi/battery"; @@ -98,6 +100,17 @@ static bool make_proc_acpi_key_val(char **_ptr, char **_key, char **_val) return true; } +#define ACPI_KEY_STATE 0x10614a06U +#define ACPI_KEY_PRESENT 0xc28ac046U +#define ACPI_KEY_CHARGING_STATE 0x5ba13e29U +#define ACPI_KEY_REMAINING_CAPACITY 0xf36952edU +#define ACPI_KEY_DESIGN_CAPACITY 0x05e6488dU + +#define ACPI_VAL_CHARGING_DISCHARGING 0xf268327aU +#define ACPI_VAL_CHARGING 0x095ee228U +#define ACPI_VAL_YES 0x0b88c316U +#define ACPI_VAL_ONLINE 0x6842bf17U + static void check_proc_acpi_battery(const char * node, bool * have_battery, bool * charging, int *seconds, int *percent) @@ -124,39 +137,53 @@ check_proc_acpi_battery(const char * node, bool * have_battery, while (make_proc_acpi_key_val(&ptr, &key, &val)) { - if (!strcmp(key, "present")) - { - if (!strcmp(val, "yes")) - *have_battery = true; - } - else if (!strcmp(key, "charging state")) - { - /* !!! FIXME: what exactly _does_ charging/discharging mean? */ - if (!strcmp(val, "charging/discharging")) - charge = true; - else if (!strcmp(val, "charging")) - charge = true; - } - else if (!strcmp(key, "remaining capacity")) - { - char *endptr = NULL; - const int cvt = (int) strtol(val, &endptr, 10); + uint32_t key_hash = djb2_calculate(key); + uint32_t val_hash = djb2_calculate(val); - if (*endptr == ' ') - remaining = cvt; + switch (key_hash) + { + case ACPI_KEY_PRESENT: + if (val_hash == ACPI_VAL_YES) + *have_battery = true; + break; + case ACPI_KEY_CHARGING_STATE: + switch (val_hash) + { + case ACPI_VAL_CHARGING_DISCHARGING: + case ACPI_VAL_CHARGING: + charge = true; + break; + } + break; + case ACPI_KEY_REMAINING_CAPACITY: + { + char *endptr = NULL; + const int cvt = (int) strtol(val, &endptr, 10); + + if (*endptr == ' ') + remaining = cvt; + } + break; } } ptr = &info[0]; + while (make_proc_acpi_key_val(&ptr, &key, &val)) { - if (!strcmp(key, "design capacity")) - { - char *endptr = NULL; - const int cvt = (int) strtol(val, &endptr, 10); + uint32_t key_hash = djb2_calculate(key); - if (*endptr == ' ') - maximum = cvt; + switch (key_hash) + { + case ACPI_KEY_DESIGN_CAPACITY: + { + char *endptr = NULL; + const int cvt = (int) strtol(val, &endptr, 10); + + if (*endptr == ' ') + maximum = cvt; + } + break; } } @@ -193,6 +220,7 @@ check_proc_acpi_battery(const char * node, bool * have_battery, } } + static void check_proc_acpi_ac_adapter(const char * node, bool *have_ac) { @@ -208,11 +236,12 @@ check_proc_acpi_ac_adapter(const char * node, bool *have_ac) ptr = &state[0]; while (make_proc_acpi_key_val(&ptr, &key, &val)) { - if (!strcmp(key, "state")) - { - if (!strcmp(val, "on-line")) - *have_ac = true; - } + uint32_t key_hash = djb2_calculate(key); + uint32_t val_hash = djb2_calculate(val); + + if (key_hash == ACPI_KEY_STATE && + val_hash == ACPI_VAL_ONLINE) + *have_ac = true; } } @@ -391,25 +420,38 @@ frontend_linux_get_powerstate(int *seconds, int *percent) return FRONTEND_POWERSTATE_NONE; } +#define LINUX_ARCH_X86_64 0x23dea434U +#define LINUX_ARCH_X86 0x0b88b8cbU +#define LINUX_ARCH_ARM 0x0b885ea5U +#define LINUX_ARCH_PPC64 0x1028cf52U +#define LINUX_ARCH_MIPS 0x7c9aa25eU +#define LINUX_ARCH_TILE 0x7c9e7873U + enum frontend_architecture frontend_linux_get_architecture(void) { + uint32_t buffer_hash; struct utsname buffer; if (uname(&buffer) != 0) return FRONTEND_ARCH_NONE; - if (!strcmp(buffer.machine, "x86_64")) - return FRONTEND_ARCH_X86_64; - if (!strcmp(buffer.machine, "x86")) - return FRONTEND_ARCH_X86; - if (!strcmp(buffer.machine, "arm")) - return FRONTEND_ARCH_ARM; - if (!strcmp(buffer.machine, "ppc64")) - return FRONTEND_ARCH_PPC; - if (!strcmp(buffer.machine, "mips")) - return FRONTEND_ARCH_MIPS; - if (!strcmp(buffer.machine, "tile")) - return FRONTEND_ARCH_TILE; + buffer_hash = djb2_calculate(buffer.machine); + + switch (buffer_hash) + { + case LINUX_ARCH_X86_64: + return FRONTEND_ARCH_X86_64; + case LINUX_ARCH_X86: + return FRONTEND_ARCH_X86; + case LINUX_ARCH_ARM: + return FRONTEND_ARCH_ARM; + case LINUX_ARCH_PPC64: + return FRONTEND_ARCH_PPC; + case LINUX_ARCH_MIPS: + return FRONTEND_ARCH_MIPS; + case LINUX_ARCH_TILE: + return FRONTEND_ARCH_TILE; + } return FRONTEND_ARCH_NONE; }