rolling_flaws_utils.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include "rolling_flaws_utils.h"
  2. #include <gui/gui.h>
  3. size_t __furi_string_extract_string(
  4. FuriString* buffer,
  5. size_t start_index,
  6. char* text,
  7. char delim,
  8. FuriString* result) {
  9. size_t len = strlen(text);
  10. size_t valid_index = furi_string_size(buffer) - 1;
  11. size_t field = furi_string_search_str(buffer, text, start_index) + len;
  12. size_t term = -1;
  13. if(field < valid_index) {
  14. term = furi_string_search_char(buffer, delim, field);
  15. if(term < valid_index) {
  16. furi_string_reset(result);
  17. furi_string_set_n(result, buffer, field, term - field);
  18. FURI_LOG_I(TAG, "%s data is >>%s<<", text, furi_string_get_cstr(result));
  19. } else {
  20. FURI_LOG_E(TAG, "Failed to find terminator for >>%s<<", text);
  21. }
  22. } else {
  23. FURI_LOG_E(TAG, "Failed to find >>%s<<", text);
  24. }
  25. return term;
  26. }
  27. size_t __furi_string_extract_string_until(
  28. FuriString* buffer,
  29. size_t start_index,
  30. char* text,
  31. char delim,
  32. FuriString* result) {
  33. size_t len = strlen(text);
  34. size_t valid_index = furi_string_size(buffer) - 1;
  35. size_t field = furi_string_search_str(buffer, text, start_index) + len;
  36. size_t term = -1;
  37. if(field < valid_index) {
  38. term = furi_string_search_char(buffer, delim, field);
  39. if(term < valid_index) {
  40. furi_string_reset(result);
  41. furi_string_set_n(result, buffer, field, term - field);
  42. FURI_LOG_I(TAG, "%s data is >>%s<<", text, furi_string_get_cstr(result));
  43. } else {
  44. term = furi_string_size(buffer);
  45. furi_string_reset(result);
  46. furi_string_set_n(result, buffer, field, term - field);
  47. FURI_LOG_E(TAG, "Failed to find terminator for >>%s<<, using end of string", text);
  48. FURI_LOG_I(TAG, "%s data is >>%s<<", text, furi_string_get_cstr(result));
  49. }
  50. } else {
  51. FURI_LOG_E(TAG, "Failed to find >>%s<<", text);
  52. }
  53. return term;
  54. }
  55. uint32_t
  56. __furi_string_extract_int(FuriString* buffer, char* text, char delim, uint32_t default_value) {
  57. uint32_t value = default_value;
  58. size_t len = strlen(text);
  59. size_t valid_index = furi_string_size(buffer) - 1;
  60. size_t field = furi_string_search_str(buffer, text, 0) + len;
  61. size_t term = -1;
  62. FURI_LOG_I(TAG, "Extracting %s from field %d len is %d", text, field, len);
  63. if(field < valid_index && len <= field) {
  64. term = furi_string_search_char(buffer, delim, field);
  65. if(term < valid_index) {
  66. FuriString* result = furi_string_alloc();
  67. furi_string_set_n(result, buffer, field, term - field);
  68. value = __furi_string_hex_to_uint32(result);
  69. FURI_LOG_D(TAG, "%s data is >>%s<<", text, furi_string_get_cstr(result));
  70. furi_string_free(result);
  71. } else {
  72. FURI_LOG_E(TAG, "Failed to find terminator for >>%s<<", text);
  73. }
  74. } else {
  75. FURI_LOG_E(TAG, "Failed to find >>%s<<", text);
  76. }
  77. return value;
  78. }
  79. uint32_t __furi_string_hex_to_uint32(FuriString* str) {
  80. uint32_t result = 0;
  81. for(size_t i = 0; i < furi_string_size(str); i++) {
  82. char ch = furi_string_get_char(str, i);
  83. result *= 16;
  84. if(ch >= '0' && ch <= '9') {
  85. result += ch - '0';
  86. } else if(ch >= 'A' && ch <= 'F') {
  87. result += ch - 'A' + 10;
  88. } else if(ch >= 'a' && ch <= 'f') {
  89. result += ch - 'a' + 10;
  90. } else {
  91. FURI_LOG_E(TAG, "Invalid hex character %c", ch);
  92. }
  93. }
  94. return result;
  95. }
  96. void __gui_redraw() {
  97. // Redraw screen
  98. Gui* gui = furi_record_open(RECORD_GUI);
  99. gui_direct_draw_acquire(gui);
  100. gui_direct_draw_release(gui);
  101. }