2 // XSLTProcessorSablotron.m
5 // Created by Marc Liyanage on Thu Aug 01 2002.
6 // Copyright (c) 2002 __MyCompanyName__. All rights reserved.
9 #import "XSLTProcessorSablotron.h"
12 @implementation XSLTProcessorSablotron
16 - (int)processorType {
18 return PROCESSORTYPE_SABLOTRON;
24 +(BOOL)checkWellFormed:(NSString *)xmlCode {
36 if (self = [super init]) {
41 SablotCreateSituation(&S);
42 SablotCreateProcessorForSituation(S, &processor);
44 memset(&msgHandlerPtr, 0, sizeof(MessageHandler));
46 msgHandlerPtr.makeCode = (MessageHandlerMakeCode *)rawMakeCodeHandler;
47 msgHandlerPtr.log = (MessageHandlerLog *)rawLogHandler;
48 msgHandlerPtr.error = (MessageHandlerError *)rawErrorHandler;
49 SablotRegHandler(processor, HLR_MESSAGE, &msgHandlerPtr, self);
62 SablotDestroyProcessor(processor);
63 SablotDestroySituation(S);
78 - (BOOL)processStrings:(NSString *)xmlCode withXslt:(NSString *)xsltCode andParameters:(const char **)params {
82 int resultCode = 0, i=0;
88 if ([self baseUri] != nil) {
89 SablotSetBase(processor, [[NSString stringWithFormat:@"%@/", [[self baseUri] stringByDeletingLastPathComponent]] cString]);
92 SablotAddArgBuffer(S, processor, "xslt", (char *)[xsltCode cString]);
93 SablotAddArgBuffer(S, processor, "xml", (char *)[xmlCode cString]);
95 while (params && params[i]) {
96 SablotAddParam(S, processor, params[i], params[i+1]);
101 // resultCode = SablotRunProcessor(processor, "arg:/xslt", "arg:/xml", "arg:/result", params, args);
102 resultCode = SablotRunProcessorGen(S, processor, "arg:/xslt", "arg:/xml", "arg:/result");
104 if ([self errorOccurred]) {
108 SablotGetResultArg(processor, "arg:/result", &resultBuffer);
110 [self setResult:[NSString stringWithCString:resultBuffer]];
112 SablotFree(resultBuffer);
120 - (BOOL)processStringsOld:(NSString *)xmlCode withXslt:(NSString *)xsltCode andParameters:(const char **)params {
128 args[1] = (char *)[xmlCode cString];
130 args[3] = (char *)[xsltCode cString];
132 args[5] = (char *)&resultBuffer;
138 if ([self baseUri] != nil) {
139 SablotSetBase(processor, [[self baseUri] cString]);
142 resultCode = SablotRunProcessor(processor, "arg:/xslt", "arg:/xml", "arg:/result", params, args);
144 if ([self errorOccurred]) {
148 SablotGetResultArg(processor,"arg:/result", &resultBuffer);
150 [self setResult:[NSString stringWithCString:resultBuffer]];
152 SablotFree(resultBuffer);
160 MH_ERROR rawErrorHandler(id self, SablotHandle processor_, MH_ERROR code, MH_LEVEL level, char **fields) {
163 NSString *currentField;
164 NSRange colonRange, keyRange, valueRange;
168 NSString *errorMessage;
172 for (i = 0; fields[i] != NULL; i++) {
174 currentField = [NSString stringWithCString:fields[i]];
176 colonRange = [currentField rangeOfString:@":"];
177 keyRange = NSMakeRange(0, colonRange.location);
178 valueRange = NSMakeRange(colonRange.location + 1, [currentField length] - (colonRange.location + 1));
180 key = [currentField substringWithRange:keyRange];
181 value = [currentField substringWithRange:valueRange];
183 if ([key isEqual:@"msg"]) {
184 errorMessage = value;
187 if ([key isEqual:@"line"]) {
188 errorLine = [value intValue];
191 if ([key isEqual:@"URI"]) {
193 if ([value isEqual:@"arg:/xml"]) {
194 errorSource = XSLT_ERROR_SOURCE_XML;
195 } else if ([value isEqual:@"arg:/xslt"]) {
196 errorSource = XSLT_ERROR_SOURCE_XSLT;
202 [self setError:errorMessage atLine:errorLine inSource:errorSource];
209 MH_ERROR rawMakeCodeHandler(id self, SablotHandle processor_, int severity, unsigned short facility, unsigned short code) {
211 // NSLog(@"makeCode, proc %p, sev %d, fac %d, code %d", processor_, severity, facility, code);
216 MH_ERROR rawLogHandler(id self, SablotHandle processor_, MH_ERROR code, MH_LEVEL level, char **fields) {
220 for (i = 0; fields[i] != NULL; i++) {
221 // NSLog(@"Sablotron Log: %s", fields[i]);