// Header #include "manager.h" // Functions - Private char** split_string(const char* str, char delimiter, int* count) { // Calculate how many substrings will be created int i, numSubstrings = 1; for (i = 0; str[i] != '\0'; i++) { if (str[i] == delimiter) { numSubstrings++; } } // Allocate memory for the array of strings char** result = malloc(numSubstrings * sizeof(char*)); *count = numSubstrings; // Split the string int start = 0, substringIndex = 0; for (i = 0; str[i] != '\0'; i++) { if (str[i] == delimiter) { int length = i - start; result[substringIndex] = malloc((length + 1) * sizeof(char)); strncpy(result[substringIndex], str + start, length); result[substringIndex][length] = '\0'; start = i + 1; substringIndex++; } } // Add the last substring int length = i - start; result[substringIndex] = malloc((length + 1) * sizeof(char)); strncpy(result[substringIndex], str + start, length); result[substringIndex][length] = '\0'; return result; } // Constructors Manager* manager_create() { // Creating result in memory Manager* result = malloc(sizeof(Manager)); // Storing password result->page = 0; // Returning manager return result; } // Functions void manager_switchpage(Manager* manager, int dir) { // Switching page manager->page += dir; // Avoiding empty pages if (manager->page < 0) {manager->page = 0;} // Loading names manager_loadnames(manager, manager->page); } void manager_loadnames(Manager* manager, int page){ // DEBUG FURI_LOG_D(TAG, "Freeing previous names"); // Freeing all prior names for (int i = 0; i < 4; i++) { // Checking if this name exists: if (manager->names[i] != NULL) { // DEBUG FURI_LOG_D(TAG, "Freed %s", manager->names[i]); // Freeing name free(manager->names[i]); } else { // DEBUG FURI_LOG_E(TAG, "Name %i does not exist!", i); } } // Loading the next four passwords char* data = store_load("Data"); // Splitting string int count = 0; char** split = split_string(data, '|', &count); // Freeing data free(data); // Temporary variables int i_pass = 0; int i_name = 0; // Going through split string for (int i = 0; i < count; i++) { // Checking if it's the 4th number if (i % 4 == 0) { // It's another password! i_pass++; // DEBUG FURI_LOG_I(TAG, "(%i) Scanning password %s...", i_pass, split[i]); // Is it on our page? if (i_pass > page * 4 && i_pass <= (page * 4) + 4) { // Adding it to the array! manager->names[i_name] = split[i]; // Increasing name index i_name++; // DEBUG FURI_LOG_D(TAG, "Added %s to names", split[i]); // Too big? if (i_name > 3) {break;} } } } // Cleanup free(split); } void manager_delete(Manager* manager) { free(manager->names); free(manager); }