// // DoCoMoResultParser.m // ZXing // // Created by Christian Brunschen on 25/06/2008. /* * Copyright 2008 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #import "DoCoMoResultParser.h" @implementation NSString (DoCoMoFieldParsing) - (NSString *)backslashUnescaped { NSRange backslashRange = [self rangeOfString:@"\\"]; if (backslashRange.location == NSNotFound) { return self; } int max = [self length]; int startLocation = 0; NSMutableString *result = [NSMutableString stringWithCapacity:[self length]]; while (backslashRange.location != NSNotFound) { [result appendString:[self substringWithRange:NSMakeRange(startLocation, backslashRange.location - startLocation)]]; [result appendFormat:@"%c", [self characterAtIndex:backslashRange.location + 1]]; startLocation = backslashRange.location + 2; NSRange searchRange = NSMakeRange(startLocation, max - startLocation); backslashRange = [self rangeOfString:@"\\" options:0 range:searchRange]; } if (startLocation < max) { [result appendString:[self substringWithRange:NSMakeRange(startLocation, max - startLocation)]]; } return [NSString stringWithString:result]; } - (NSArray *)fieldsWithPrefix:(NSString *)prefix { return [self fieldsWithPrefix:prefix terminator:@";"]; } - (NSArray *)fieldsWithPrefix:(NSString *)prefix terminator:(NSString *)term { NSMutableArray *result = nil; int i = 0; int max = [self length]; NSRange searchRange; NSRange foundRange; while (i < max) { searchRange = NSMakeRange(i, max - i); foundRange = [self rangeOfString:prefix options:0 range:searchRange]; if(foundRange.location == NSNotFound) { break; } int start = i = foundRange.location + foundRange.length; bool done = false; while (!done) { searchRange = NSMakeRange(i, max - i); NSRange termRange = [self rangeOfString:term options:0 range:searchRange]; if (termRange.location == NSNotFound) { i = max; done = true; } else if ([self characterAtIndex:termRange.location-1] == (unichar)'\\') { i++; } else { NSString *substring = [self substringWithRange:NSMakeRange(start, termRange.location - start)]; NSString *unescaped = [substring backslashUnescaped]; if (result == nil) { result = [NSMutableArray arrayWithObject:unescaped]; } else { [result addObject:unescaped]; } i = termRange.location + termRange.length; done = true; } } } return result; } - (NSString *)fieldWithPrefix:(NSString *)prefix { return [self fieldWithPrefix:prefix terminator:@";"]; } - (NSString *)fieldWithPrefix:(NSString *)prefix terminator:(NSString *)term { NSArray *fields = [self fieldsWithPrefix:prefix terminator:term]; if (fields.count == 0) { return nil; } else { return [fields lastObject]; } } @end @implementation DoCoMoResultParser @end