#include "xml.h" #include #include extern xSemaphoreHandle MutexAccessFlash; FIL FileConfig; xml_status_typeDef xml_get_data(const TCHAR *path, const char *str_tag, const char *str_attr, const char *tag, const char *attr, char *value); uint32_t _substr(char *str, uint32_t PosStart, char end, char *s); xml_status_typeDef xml_get_tag(const TCHAR *path, const char *str_tag, const char *str_attr, const char *tag, char *value) { if((path == NULL) || (str_tag == NULL) || (value == NULL)) return XML_ERR; return xml_get_data(path, str_tag, str_attr, tag, NULL, value); } xml_status_typeDef xml_get_attr(const TCHAR *path, const char *str_tag, const char *str_attr, const char *attr, char *value) { if((path == NULL) || (str_tag == NULL) || (value == NULL)) return XML_ERR; return xml_get_data(path, str_tag, str_attr, NULL, attr, value); } /* Чтение атрибута у тега по атрибуту(возвращает статус выполнения операции) path - указатель на имя файла для чтения str_tag - указатель на тег у которого нужно получить атрибут str_attr - указатель на атрибут для поиска (если NULL, то поиск производится только по тегу) tag - указатель на тег для поиска attr - указатель на атрибут для поиска value - возвращаемое значение (возвращает строку) возвращаемое значение: XML_ERR - отрибут не найден или ошибка открытия файла, XML_OK - все хорошо */ xml_status_typeDef xml_get_data(const TCHAR *path, const char *str_tag, const char *str_attr, const char *tag, const char *attr, char *value) { uint8_t state = 0; char *p = NULL, BufferRead[128] = {0}/*, tagBuff[64] = {0}*/; volatile _Bool find_attr = 0, find_tag = 0; FRESULT res; if((path == NULL) || (str_tag == NULL) || (value == NULL)) return XML_ERR; memset(value, NULL, strlen(value)); xSemaphoreTake(MutexAccessFlash, portMAX_DELAY); res = f_open(&FileConfig, path, FA_READ); if(res == FR_OK){ for(state = 0; state <= 2;){ switch(state){ case 0: if(f_gets(BufferRead, 128, &FileConfig) != NULL) state = 1; else if(f_eof(&FileConfig) != 0) state = 3; break; case 1: if((p = strchr(BufferRead, '<')) != NULL){ if(!find_tag){ if(strstr(p, str_tag) != NULL){ // нашли тег find_tag = 1; if(str_attr != NULL){ if(!find_attr){ if(strstr(p, str_attr) != NULL) find_attr = 1; // нашли атрибут } } } } if((!find_tag) || ((!find_attr) && (str_attr != NULL))){ find_tag = 0; state = 0; } else state = 2; } break; case 2: if(attr != NULL){ // получаем атрибут if((p = strstr(p, attr)) != NULL){ // атрибут нужный нам if((p = strchr(p, '"')) != NULL){ // есть кавычка _substr(p, 1, '"', value); // нашли атрибут тега /*закрытие найти*/ state = 4; break; } } else state = 3; } else if(tag != NULL){ // получаем данные тега if((p = strstr(p, tag)) != NULL){ // нашли тег if((p = strchr(p, '>')) != NULL){ _substr(p, 1, '<', value); /*закрытие найти*/ state = 4; break; } } else state = 0; } break; } } f_close(&FileConfig); } else if(res == FR_NO_FILE) state = 5; //проблемы с откритием файла(его может не быть) else state = 3; xSemaphoreGive(MutexAccessFlash); return (state == 4) ? XML_OK : (state == 5) ? XML_ERR_NO_FILE : XML_ERR; } uint32_t _substr(char *str, uint32_t PosStart, char end, char *s) // возвращает длину подстроки, 0 если нет конечного символа { uint8_t len = 0; uint8_t PosEnd = 0; uint8_t StrLen = strlen(str); if(StrLen == 0) return 0; for(; str[PosStart + PosEnd] != end; PosEnd++) { len++; if(StrLen == len) return 0; } for(uint8_t i = 0; i < len; i++) s[i] = str[i + PosStart]; s[len] = '\0'; return len; }