| 1 | #include "xml.h" | 
|---|
| 2 | #include <stdio.h> | 
|---|
| 3 | #include <string.h> | 
|---|
| 4 |  | 
|---|
| 5 | extern xSemaphoreHandle MutexAccessFlash; | 
|---|
| 6 | FIL FileConfig; | 
|---|
| 7 |  | 
|---|
| 8 | 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); | 
|---|
| 9 | uint32_t _substr(char *str, uint32_t PosStart, char end, char *s); | 
|---|
| 10 |  | 
|---|
| 11 | xml_status_typeDef xml_get_tag(const TCHAR *path, const char *str_tag, const char *str_attr, const char *tag, char *value) | 
|---|
| 12 | { | 
|---|
| 13 | if((path == NULL) || (str_tag == NULL) || (value == NULL)) return XML_ERR; | 
|---|
| 14 |  | 
|---|
| 15 | return xml_get_data(path, str_tag, str_attr, tag, NULL, value); | 
|---|
| 16 | } | 
|---|
| 17 |  | 
|---|
| 18 | xml_status_typeDef xml_get_attr(const TCHAR *path, const char *str_tag, const char *str_attr, const char *attr, char *value) | 
|---|
| 19 | { | 
|---|
| 20 | if((path == NULL) || (str_tag == NULL) || (value == NULL)) return XML_ERR; | 
|---|
| 21 |  | 
|---|
| 22 | return xml_get_data(path, str_tag, str_attr, NULL, attr, value); | 
|---|
| 23 | } | 
|---|
| 24 |  | 
|---|
| 25 | /* | 
|---|
| 26 | ×òåíèå àòðèáóòà ó òåãà ïî àòðèáóòó(âîçâðàùàåò ñòàòóñ âûïîëíåíèÿ îïåðàöèè) | 
|---|
| 27 | path - óêàçàòåëü íà èìÿ ôàéëà äëÿ ÷òåíèÿ | 
|---|
| 28 | str_tag - óêàçàòåëü íà òåã ó êîòîðîãî íóæíî ïîëó÷èòü àòðèáóò | 
|---|
| 29 | str_attr - óêàçàòåëü íà àòðèáóò äëÿ ïîèñêà (åñëè NULL, òî ïîèñê ïðîèçâîäèòñÿ òîëüêî ïî òåãó) | 
|---|
| 30 | tag - óêàçàòåëü íà òåã äëÿ ïîèñêà | 
|---|
| 31 | attr - óêàçàòåëü íà àòðèáóò äëÿ ïîèñêà | 
|---|
| 32 |  | 
|---|
| 33 | value - âîçâðàùàåìîå çíà÷åíèå  (âîçâðàùàåò ñòðîêó) | 
|---|
| 34 |  | 
|---|
| 35 | âîçâðàùàåìîå çíà÷åíèå: XML_ERR - îòðèáóò íå íàéäåí èëè îøèáêà îòêðûòèÿ ôàéëà, XML_OK - âñå õîðîøî | 
|---|
| 36 | */ | 
|---|
| 37 | 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) | 
|---|
| 38 | { | 
|---|
| 39 | uint8_t state = 0; | 
|---|
| 40 | char *p = NULL, BufferRead[128] = {0}/*, tagBuff[64] = {0}*/; | 
|---|
| 41 | volatile _Bool find_attr = 0, find_tag = 0; | 
|---|
| 42 | FRESULT res; | 
|---|
| 43 |  | 
|---|
| 44 | if((path == NULL) || (str_tag == NULL) || (value == NULL)) return XML_ERR; | 
|---|
| 45 |  | 
|---|
| 46 | memset(value, NULL, strlen(value)); | 
|---|
| 47 | xSemaphoreTake(MutexAccessFlash, portMAX_DELAY); | 
|---|
| 48 |  | 
|---|
| 49 | res = f_open(&FileConfig, path, FA_READ); | 
|---|
| 50 | if(res == FR_OK){ | 
|---|
| 51 | for(state = 0; state <= 2;){ | 
|---|
| 52 | switch(state){ | 
|---|
| 53 | case 0: | 
|---|
| 54 | if(f_gets(BufferRead, 128, &FileConfig) != NULL) state = 1; | 
|---|
| 55 | else if(f_eof(&FileConfig) != 0) state = 3; | 
|---|
| 56 | break; | 
|---|
| 57 | case 1: | 
|---|
| 58 | if((p = strchr(BufferRead, '<')) != NULL){ | 
|---|
| 59 | if(!find_tag){ | 
|---|
| 60 | if(strstr(p, str_tag) != NULL){ // íàøëè òåã | 
|---|
| 61 | find_tag = 1; | 
|---|
| 62 | if(str_attr != NULL){ | 
|---|
| 63 | if(!find_attr){ | 
|---|
| 64 | if(strstr(p, str_attr) != NULL) find_attr = 1; // íàøëè àòðèáóò | 
|---|
| 65 | } | 
|---|
| 66 | } | 
|---|
| 67 | } | 
|---|
| 68 | } | 
|---|
| 69 | if((!find_tag) || ((!find_attr) && (str_attr != NULL))){ | 
|---|
| 70 | find_tag = 0; | 
|---|
| 71 | state = 0; | 
|---|
| 72 | } | 
|---|
| 73 | else state = 2; | 
|---|
| 74 | } | 
|---|
| 75 | break; | 
|---|
| 76 | case 2: | 
|---|
| 77 | if(attr != NULL){ // ïîëó÷àåì àòðèáóò | 
|---|
| 78 | if((p = strstr(p, attr)) != NULL){ // àòðèáóò íóæíûé íàì | 
|---|
| 79 | if((p = strchr(p, '"')) != NULL){ // åñòü êàâû÷êà | 
|---|
| 80 | _substr(p, 1, '"', value); // íàøëè àòðèáóò òåãà | 
|---|
| 81 | /*çàêðûòèå íàéòè*/ | 
|---|
| 82 | state = 4; | 
|---|
| 83 | break; | 
|---|
| 84 | } | 
|---|
| 85 | } | 
|---|
| 86 | else state = 3; | 
|---|
| 87 | } | 
|---|
| 88 | else if(tag != NULL){ // ïîëó÷àåì äàííûå òåãà | 
|---|
| 89 | if((p = strstr(p, tag)) != NULL){ // íàøëè òåã | 
|---|
| 90 | if((p = strchr(p, '>')) != NULL){ | 
|---|
| 91 | _substr(p, 1, '<', value); | 
|---|
| 92 | /*çàêðûòèå íàéòè*/ | 
|---|
| 93 | state = 4; | 
|---|
| 94 | break; | 
|---|
| 95 | } | 
|---|
| 96 | } | 
|---|
| 97 | else state = 0; | 
|---|
| 98 | } | 
|---|
| 99 | break; | 
|---|
| 100 | } | 
|---|
| 101 | } | 
|---|
| 102 | f_close(&FileConfig); | 
|---|
| 103 | } | 
|---|
| 104 | else if(res == FR_NO_FILE) state = 5; //ïðîáëåìû ñ îòêðèòèåì ôàéëà(åãî ìîæåò íå áûòü) | 
|---|
| 105 | else state = 3; | 
|---|
| 106 |  | 
|---|
| 107 | xSemaphoreGive(MutexAccessFlash); | 
|---|
| 108 | return (state == 4) ? XML_OK : (state == 5) ? XML_ERR_NO_FILE : XML_ERR; | 
|---|
| 109 | } | 
|---|
| 110 |  | 
|---|
| 111 | uint32_t _substr(char *str, uint32_t PosStart, char end, char *s) // âîçâðàùàåò äëèíó ïîäñòðîêè, 0 åñëè íåò êîíå÷íîãî ñèìâîëà | 
|---|
| 112 | { | 
|---|
| 113 | uint8_t len = 0; | 
|---|
| 114 | uint8_t PosEnd = 0; | 
|---|
| 115 | uint8_t StrLen = strlen(str); | 
|---|
| 116 | if(StrLen == 0) return 0; | 
|---|
| 117 |  | 
|---|
| 118 | for(; str[PosStart + PosEnd] != end; PosEnd++) | 
|---|
| 119 | { | 
|---|
| 120 | len++; | 
|---|
| 121 | if(StrLen == len) return 0; | 
|---|
| 122 | } | 
|---|
| 123 | for(uint8_t i = 0; i < len; i++) s[i] = str[i + PosStart]; | 
|---|
| 124 | s[len] = '\0'; | 
|---|
| 125 | return len; | 
|---|
| 126 | } | 
|---|