|
|
1.1 root 1: /*
2: Copyright (c) 2004-2005 TrueCrypt Foundation. All rights reserved.
3:
4: Covered by TrueCrypt License 2.0 the full text of which is contained in the file
5: License.txt included in TrueCrypt binary and source code distribution archives.
6: */
7:
8: #include <windows.h>
9: #include <stdio.h>
10: #include "Xml.h"
11:
12:
13: static BOOL BeginsWith (char *string, char *subString)
14: {
15: while (*string++ == *subString++)
16: {
17: if (*subString == 0) return TRUE;
18: if (*string == 0) return FALSE;
19: }
20:
21: return FALSE;
22: }
23:
24:
25: char *XmlNextNode (char *xmlNode)
26: {
27: char *t = xmlNode + 1;
28: while ((t = strchr (t, '<')) != NULL)
29: {
30: if (t[1] != '/')
31: return t;
32:
33: t++;
34: }
35:
36: return NULL;
37: }
38:
39:
40: char *XmlFindElement (char *xmlNode, char *nodeName)
41: {
42: char *t = xmlNode;
43: size_t nameLen = strlen (nodeName);
44:
45: do
46: {
47: if (BeginsWith (t + 1, nodeName)
48: && (t[nameLen + 1] == '>'
49: || t[nameLen + 1] == ' ')) return t;
50:
51: } while (t = XmlNextNode (t));
52:
53: return NULL;
54: }
55:
56:
57: char *XmlFindElementByAttributeValue (char *xml, char *nodeName, char *attrName, char *attrValue)
58: {
59: char attr[2048];
60:
61: while (xml = XmlFindElement (xml, nodeName))
62: {
63: XmlAttribute (xml, attrName, attr, sizeof (attr));
64: if (strcmp (attr, attrValue) == 0)
65: return xml;
66:
67: xml++;
68: }
69:
70: return NULL;
71: }
72:
73:
74: char *XmlAttribute (char *xmlNode, char *xmlAttrName, char *xmlAttrValue, int xmlAttrValueSize)
75: {
76: char *t = xmlNode;
77: char *e = xmlNode;
78: int l = 0;
79:
80: xmlAttrValue[0] = 0;
81: if (t[0] != '<') return NULL;
82:
83: e = strchr (e, '>');
84: if (e == NULL) return NULL;
85:
86: while ((t = strstr (t, xmlAttrName)) && t < e)
87: {
88: char *o = t + strlen (xmlAttrName);
89: if (t[-1] == ' '
90: &&
91: (BeginsWith (o, "=\"")
92: || BeginsWith (o, "= \"")
93: || BeginsWith (o, " =\"")
94: || BeginsWith (o, " = \""))
95: )
96: break;
97:
98: t++;
99: }
100:
101: if (t == NULL || t > e) return NULL;
102:
103: t = strchr (t, '"') + 1;
104: e = strchr (t, '"');
105: l = (int)(e - t);
106: if (e == NULL || l > xmlAttrValueSize) return NULL;
107:
108: memcpy (xmlAttrValue, t, l);
109: xmlAttrValue[l] = 0;
110:
111: return xmlAttrValue;
112: }
113:
114:
115: char *XmlNodeText (char *xmlNode, char *xmlText, int xmlTextSize)
116: {
117: char *t = xmlNode;
118: char *e = xmlNode + 1;
119: int l = 0, i = 0, j = 0;
120:
121: xmlText[0] = 0;
122:
123: if (t[0] != '<')
124: return NULL;
125:
126: t = strchr (t, '>') + 1;
127: if (t == NULL) return NULL;
128:
129: e = strchr (e, '<');
130: if (e == NULL) return NULL;
131:
132: l = (int)(e - t);
133: if (e == NULL || l > xmlTextSize) return NULL;
134:
135: while (i < l)
136: {
137: if (BeginsWith (&t[i], "<"))
138: {
139: xmlText[j++] = '<';
140: i += 4;
141: continue;
142: }
143: if (BeginsWith (&t[i], ">"))
144: {
145: xmlText[j++] = '>';
146: i += 4;
147: continue;
148: }
149: if (BeginsWith (&t[i], "&"))
150: {
151: xmlText[j++] = '&';
152: i += 5;
153: continue;
154: }
155: xmlText[j++] = t[i++];
156: }
157: xmlText[j] = 0;
158:
159: return t;
160: }
161:
162:
163: int XmlWriteHeader (FILE *file)
164: {
165: return fputs ("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<TrueCrypt>", file);
166: }
167:
168:
169: int XmlWriteFooter (FILE *file)
170: {
171: return fputs ("\n</TrueCrypt>", file);
172: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.