This repository was archived by the owner on Aug 27, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathMPWXmlScanner16BitLE.m
More file actions
177 lines (144 loc) · 5.06 KB
/
MPWXmlScanner16BitLE.m
File metadata and controls
177 lines (144 loc) · 5.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
/* MPWXmlScanner16BitLE.m Copyright (c) 1999 by Marcel P. Weiher, All Rights Reserved */
#import "MPWXmlScanner16BitLE.h"
#import "MPWXmlScanner16BitBE.h"
#import "MPWXmlParser.h"
#define xmlchar unichar
#define XMLCHAR(x) NSSwapHostShortToLittle(x)
#define NATIVECHAR(x) NSSwapLittleShortToHost(x)
static unichar cdata[]={ XMLCHAR('<'), XMLCHAR('!') , XMLCHAR('['),XMLCHAR('C'),XMLCHAR('D'),XMLCHAR('A'),XMLCHAR('T'),XMLCHAR('A'),XMLCHAR('[') };
static unichar endcomment[]={ XMLCHAR('-'),XMLCHAR('-') , XMLCHAR('>')};
static unichar empty[]={ 0, };
static int unicharncmp( const xmlchar *left, const xmlchar *right, int length )
{
int res,i;
for (i=0;i<length;i++) {
if ( 0 != (res = right[i]-left[i]) ) {
break;
}
}
return res;
}
#define CDATA cdata
#define ENDCOMMENT endcomment
#define CHARCOMP unicharncmp
#define EMPTYSTRING empty
#import "XmlScannerPseudoMacro.h"
@implementation MPWXmlScanner(sixteenBitBE)
-(BOOL)makeTextBE:(const xmlchar*)start length:(int)len firstEntityOffset:(int)entityStart
{
NSLog(@"%s: unicode string: %@",__FUNCTION__,[NSString stringWithCharacters:start length:len]);
return YES;
}
-(BOOL)makeCDataBE:(const xmlchar*)start length:(int)len
{
NSLog(@"%s: unicode string: %@",__FUNCTION__,[NSString stringWithCharacters:start length:len]);
return YES;
}
-(BOOL)beginElementBE:(const xmlchar*)start length:(int)len nameLen:(int)nameEnd
{
NSLog(@"%s: unicode string: %@",__FUNCTION__,[NSString stringWithCharacters:start length:len]);
return YES;
}
-(BOOL)endElementBE:(const xmlchar*)start length:(int)len
{
NSLog(@"%s: unicode string: %@",__FUNCTION__,[NSString stringWithCharacters:start length:len]);
return YES;
}
-(BOOL)makeSgmlBE:(const xmlchar*)start length:(int)len nameLen:(int)nameEnd
{
NSLog(@"%s: unicode string: %@",__FUNCTION__,[NSString stringWithCharacters:start length:len]);
return YES;
}
-(BOOL)makePIBE:(const xmlchar*)start length:(int)len nameLen:(int)nameEnd
{
NSLog(@"%s: unicode string: %@",__FUNCTION__,[NSString stringWithCharacters:start length:len]);
return YES;
}
-(BOOL)makeEntityRefBE:(const xmlchar*)start length:(int)len
{
NSLog(@"%s: unicode string: %@",__FUNCTION__,[NSString stringWithCharacters:start length:len]);
return YES;
}
-(void)scan16bitBE:(NSData*)aData
{
ProcessFunc text = (ProcessFunc)[self methodForSelector:@selector(makeTextBE:length:firstEntityOffset:)];
ProcessFunc space = (ProcessFunc)[self methodForSelector:@selector(makeTextBE:length:firstEntityOffset:)];
ProcessFunc cdata = (ProcessFunc)[self methodForSelector:@selector(makeCDataBE:length:)];
ProcessFunc sgml = (ProcessFunc)[self methodForSelector:@selector(makeSgmlBE:length:nameLen:)];
ProcessFunc pi = (ProcessFunc)[self methodForSelector:@selector(makePIBE:length:nameLen:)];
ProcessFunc openTag = (ProcessFunc)[self methodForSelector:@selector(beginElementBE:length:nameLen:)];
ProcessFunc closeTag = (ProcessFunc)[self methodForSelector:@selector(endElementBE:length:)];
// ProcessFunc entityRef = (ProcessFunc)[self methodForSelector:@selector(makeEntityRef:length:)];
data=[aData retain];
scanXml( [data bytes], [data length] / sizeof(xmlchar), openTag, closeTag, sgml,pi, text,space,cdata, self );
[data release];
data=nil;
}
@end
@implementation MPWXmlParser(sixtenBit)
-(BOOL)endElementBE:(const xmlchar*)start length:(int)len
{
id endName;
int i;
start+=2;
len-=3;
endName = MPWUniqueStringWithUnichars(start,len);
if ( [[self currentTag] isEqual: endName] ) {
[self popTag];
[self endElement:endName];
return YES;
} else {
[NSException raise:@"non-matching tags" format:@"non matching tags start '%@' end '%@'",[self currentTag],endName];
return NO;
}
}
-(BOOL)beginElementBE:(const xmlchar*)start length:(int)len nameLen:(int)nameLen
{
id tag;
BOOL isEmpty=NO;
const xmlchar *attrStart;
int attrLen;
id attrs;
start++;
nameLen--;
len-=2;
attrStart=start+nameLen+1;
attrLen=len-nameLen-1;
if ( start[len-1]=='/' ) {
isEmpty=YES;
len--;
} else {
}
tag = MPWUniqueStringWithUnichars(start,nameLen);
[self pushTag:tag];
attrs = GETOBJECT(attributeCache);
// [self scanAttributesFromData:[NSString stringWithCharacters:start length:nameLen] into:attrs];
[self beginElement:tag attributes:attrs];
if ( isEmpty ) {
[self popTag];
[self endElement:tag];
}
return YES;
}
-(BOOL)characterDataAllowed
{
return NO;
}
-(BOOL)makeTextBE:(const xmlchar*)start length:(int)len firstEntityOffset:(int)entityOffset
{
if ([self characterDataAllowed] ) {
[self characters:[NSString stringWithCharacters:start length:len]];
}
return YES;
}
-(BOOL)makeCDataBE:(const xmlchar*)start length:(int)len
{
int cdlen = 9;
start+=cdlen;
len-=cdlen+2;
if ( [self characterDataAllowed] ) {
[self cdata:[NSString stringWithCharacters:start length:len]];
//--- also have to check for non '@' valueType
}
return YES;
}