]> err.no Git - sope/commitdiff
fixed a Unicode issue
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Thu, 24 Nov 2005 23:01:51 +0000 (23:01 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Thu, 24 Nov 2005 23:01:51 +0000 (23:01 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@1190 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-xml/SaxObjC/ChangeLog
sope-xml/SaxObjC/SaxMethodCallHandler.m
sope-xml/SaxObjC/Version

index 2ae3f6c7703753b153a5864a87fcea06eab34ff1..a8f58a8c05b8fccab7c7789bdf9af21179c5f4ac 100644 (file)
@@ -1,3 +1,8 @@
+2005-11-25  Helge Hess  <helge.hess@opengroupware.org>
+
+       * SaxMethodCallHandler.m: rewrote tag=>selector mapping function to be
+         Unicode safe (v4.5.53)
+
 2005-08-16  Helge Hess  <helge.hess@opengroupware.org>
 
        * v4.5.52
index 85ed9e4b0ce0a51ef35ad17bf5784b6e6adaceed..b6c97228b9a98dd4d4018872d6018bb2f9ad4d1f 100644 (file)
 static BOOL debugOn = NO;
 
 - (id)init {
-  if ((self = [super init])) {
+  if ((self = [super init]) != nil) {
     self->delegate = self;
     
-    self->fqNameToStartSel = NSCreateMapTable(NSObjectMapKeyCallBacks,
-                                              NSNonOwnedPointerMapValueCallBacks,
-                                              64);
+    self->fqNameToStartSel = 
+      NSCreateMapTable(NSObjectMapKeyCallBacks,
+                      NSNonOwnedPointerMapValueCallBacks,
+                      64);
     self->selName     = [[NSMutableString alloc] initWithCapacity:64];
     self->tagStack    = [[NSMutableArray alloc] initWithCapacity:16];
     
@@ -137,52 +138,57 @@ static inline void _selAdd(SaxMethodCallHandler *self, NSString *_s) {
   [self->selName appendString:_s];
 }
 static inline void _selAddEscaped(SaxMethodCallHandler *self, NSString *_s) {
-  const unsigned char *cstr;
   register unsigned i, len;
+  unichar *buf16;
   BOOL needsEscape = NO;
+    unichar *buf;
+    unsigned j;
+    NSString *s;
   
-  if ((len = [_s cStringLength]) == 0)
+  if ((len = [_s length]) == 0)
     return;
   
-  cstr = (const unsigned char *)[_s cString];
+  buf16 = calloc(len + 2, sizeof(unichar));
   for (i = 0; i < len; i++) {
-    register unsigned char c = cstr[i];
-
-    if (!(isalnum((int)c) || (c == '_'))) {
+    // TODO: does isalnum work OK for Unicode? (at least it takes an int)
+    if (!(isalnum(buf16[i]) || (buf16[i] == '_'))) {
       needsEscape = YES;
       break;
     }
   }
   
-  if (needsEscape) {
-    unsigned char *buf;
-    unsigned j;
-    NSString *s;
-    
-    buf = malloc(len + 1);
-    for (i = 0, j = 0; i < len; i++) {
-      register unsigned char c = cstr[i];
+  if (!needsEscape) { /* no escaping required, stop processing */
+    if (buf16 != NULL) free(buf16);
+    [self->selName appendString:_s];
+    return;
+  }
+  
+  /* strip out all non-ASCII, non-alnum or _ chars */
+  
+  buf = calloc(len + 2, sizeof(unichar));
+  for (i = 0, j = 0; i < len; i++) {
+    register unichar c = buf16[i];
       
-      if (isalnum((int)c) || (c == '_')) {
-        if (i > 0) {
-          if (cstr[i - 1] == '-')
-            c = toupper(c);
-        }
-        buf[j] = c;
-        j++;
-      }
-      else {
-        /* do nothing, leave out char */
+    // TODO: isalnum() vs Unicode
+    if (isalnum((int)c) || (c == '_')) {
+      if (i > 0) {
+       if (buf16[i - 1] == '-')
+         c = toupper(c);
       }
+      buf[j] = c;
+      j++;
     }
-    buf[j] = '\0';
-    
-    s = [[NSString alloc] initWithCString:(char *)buf length:j];
-    [self->selName appendString:s];
-    [s release];
+    /* else: do nothing, leave out non-ASCII char */
   }
-  else
-    [self->selName appendString:_s];
+  buf[j] = '\0';
+  
+  if (buf16 != NULL) free(buf16);
+  
+  s = [[NSString alloc] initWithCharacters:buf length:j];
+  if (buf != NULL) free(buf);
+  
+  [self->selName appendString:s];
+  [s release];
 }
 
 - (void)startElement:(NSString *)_localName
index 063faafb4c27540a9ba0e6b8df743c7cf2c48e11..d124b50f26de387d248a94761fd62b6a22df310b 100644 (file)
@@ -1,3 +1,3 @@
 # version file
 
-SUBMINOR_VERSION:=52
+SUBMINOR_VERSION:=53