source: S-port/trunk/Core/Src/xml.c

Last change on this file was 1, checked in by AlexLir, 3 years ago
File size: 3.9 KB
Line 
1#include "xml.h"
2#include <stdio.h>
3#include <string.h>
4
5extern xSemaphoreHandle MutexAccessFlash;
6FIL FileConfig;
7
8xml_status_typeDef xml_get_data(const TCHAR *path, const char *str_tag, const char *str_attr, const char *tag, const char *attr, char *value);
9uint32_t _substr(char *str, uint32_t PosStart, char end, char *s);
10
11xml_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
18xml_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*/
37xml_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
111uint32_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}
Note: See TracBrowser for help on using the repository browser.