Revision: 22472
          http://sourceforge.net/p/bibdesk/svn/22472
Author:   hofman
Date:     2018-07-26 16:12:17 +0000 (Thu, 26 Jul 2018)
Log Message:
-----------
Ignore escaped digit in etal optional argument

Modified Paths:
--------------
    trunk/bibdesk/BDSKFormatParser.m

Modified: trunk/bibdesk/BDSKFormatParser.m
===================================================================
--- trunk/bibdesk/BDSKFormatParser.m    2018-07-26 08:54:48 UTC (rev 22471)
+++ trunk/bibdesk/BDSKFormatParser.m    2018-07-26 16:12:17 UTC (rev 22472)
@@ -74,7 +74,7 @@
 
 static inline BOOL stringHasCharacterNotInRange(NSString *string, NSRange 
range);
 
-static BOOL scanOptArg(NSScanner *scanner, NSString **result);
+static BOOL scanOptArg(NSScanner *scanner, NSString **result, BOOL 
*lastCharEscaped);
 static BOOL scanSignedDigit(NSScanner *scanner, NSUInteger *resultDigit, BOOL 
*resultSign);
 
 + (void)initialize {
@@ -147,9 +147,10 @@
                                        NSString *authSep = @"";
                                        NSString *etal = @"";
                     BOOL isLast = NO;
+                    BOOL wasEscaped = NO;
                                        if (NO == [scanner isAtEnd]) {
                                                // look for [separator] and 
[etal]
-                        scanOptArg(scanner, &authSep) && scanOptArg(scanner, 
&etal);
+                        scanOptArg(scanner, &authSep, NULL) && 
scanOptArg(scanner, &etal, &wasEscaped);
                         // look for #names and #chars per name
                         if (scanSignedDigit(scanner, &numAuth, &isLast)) {
                             if (NO == [scanner scanUnsignedInteger:&numChars]) 
numChars = 0;
@@ -164,7 +165,7 @@
                                        }
                                        if (numAuth == 0 || numAuth > 
[authArray count]) {
                                                numAuth = [authArray count];
-                    } else if (numAuth < [authArray count] && [[NSCharacterSet 
decimalDigitCharacterSet] characterIsMember:[etal lastCharacter]]) {
+                    } else if (numAuth < [authArray count] && wasEscaped == NO 
&& [[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[etal 
lastCharacter]]) {
                         i = (NSUInteger)[[etal substringFromIndex:[etal 
length] - 1] integerValue];
                         etal = [etal substringToIndex:[etal length] - 1];
                         if (i > 0 && i < numAuth)
@@ -197,9 +198,10 @@
                                        NSString *nameSep = @".";
                                        NSString *etal = @"";
                     BOOL isLast = NO;
+                    BOOL wasEscaped = NO;
                                        if (NO == [scanner isAtEnd]) {
                                                // look for [author separator], 
[name separator], and [etal]
-                        scanOptArg(scanner, &authSep) && scanOptArg(scanner, 
&nameSep) && scanOptArg(scanner, &etal);
+                        scanOptArg(scanner, &authSep, NULL) && 
scanOptArg(scanner, &nameSep, NULL) && scanOptArg(scanner, &etal, &wasEscaped);
                         // look for #names
                         scanSignedDigit(scanner, &numAuth, &isLast);
                                        }
@@ -212,7 +214,7 @@
                                        }
                                        if (numAuth == 0 || numAuth > 
[authArray count]) {
                                                numAuth = [authArray count];
-                    } else if (numAuth < [authArray count] && [[NSCharacterSet 
decimalDigitCharacterSet] characterIsMember:[etal lastCharacter]]) {
+                    } else if (numAuth < [authArray count] && wasEscaped == NO 
&& [[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[etal 
lastCharacter]]) {
                         i = (NSUInteger)[[etal substringFromIndex:[etal 
length] - 1] integerValue];
                         etal = [etal substringToIndex:[etal length] - 1];
                         if (i > 0 && i < numAuth)
@@ -267,7 +269,7 @@
                     NSUInteger smallWordLength = 3;
                     NSString *numString = nil;
                     NSString *title = [pub title];
-                    if (scanOptArg(scanner, &numString))
+                    if (scanOptArg(scanner, &numString, NULL))
                         smallWordLength = (NSUInteger)[numString integerValue];
                                        if (NO == [scanner 
scanUnsignedInteger:&numWords]) numWords = 0;
                                        if ([NSString isEmptyString:title] == 
NO) {
@@ -355,7 +357,7 @@
                                        NSString *slash = (isLocalFile) ? @"-" 
: @"/";
                                        NSString *sep = nil;
                     // look for [slash] and [sep]
-                    scanOptArg(scanner, &slash) && scanOptArg(scanner, &sep);
+                    scanOptArg(scanner, &slash, NULL) && scanOptArg(scanner, 
&sep, NULL);
                     NSString *keywordsString = [pub 
stringValueOfField:BDSKKeywordsString];
                                        NSUInteger i, numWords = 0;
                     if (NO == [scanner scanUnsignedInteger:&numWords]) 
numWords = 0;
@@ -446,7 +448,7 @@
                                {
                        // old file extension without period
                     NSString *defaultExt = @"";
-                                       scanOptArg(scanner, &defaultExt);
+                                       scanOptArg(scanner, &defaultExt, NULL);
                                        NSString *filename = nil;
                     if (file)
                                                filename = [[file URL] path];
@@ -484,7 +486,7 @@
                                                [scanner scanUpToString:@"}" 
intoString:&key] &&
                                                [scanner scanString:@"}" 
intoString:NULL]) {
                                                // look for [slash]
-                                               scanOptArg(scanner, &slash);
+                                               scanOptArg(scanner, &slash, 
NULL);
                         
                                                if (NO == [scanner 
scanUnsignedInteger:&numChars]) numChars = 0;
                                                if (NO == [fieldName 
isEqualToString:BDSKCiteKeyString] &&
@@ -522,7 +524,7 @@
                                                [scanner scanUpToString:@"}" 
intoString:&key] &&
                                                [scanner scanString:@"}" 
intoString:NULL]) {
                         // look for [sep chars], [slash], and [sep]
-                        scanOptArg(scanner, &sepChars) && scanOptArg(scanner, 
&slash) && scanOptArg(scanner, &sep);
+                        scanOptArg(scanner, &sepChars, NULL) && 
scanOptArg(scanner, &slash, NULL) && scanOptArg(scanner, &sep, NULL);
                         if ([NSString isEmptyString:sepChars])
                             sepChars = @" ";
                         NSString *wordsString = [pub stringValueOfField:key];
@@ -596,7 +598,7 @@
                                                [scanner scanUpToString:@"}" 
intoString:&key] &&
                                                [scanner scanString:@"}" 
intoString:NULL]) {
                                                // look for [yes value]m, [no 
value], and [mixed value]
-                        scanOptArg(scanner, &yesValue) && scanOptArg(scanner, 
&noValue) && scanOptArg(scanner, &mixedValue);
+                        scanOptArg(scanner, &yesValue, NULL) && 
scanOptArg(scanner, &noValue, NULL) && scanOptArg(scanner, &mixedValue, NULL);
                                                if (NO == [scanner 
scanUnsignedInteger:&numChars]) numChars = 0;
                         intValue = [pub integerValueOfField:key];
                         value = (intValue == 0 ? noValue : (intValue == 1 ? 
yesValue : mixedValue));
@@ -695,7 +697,7 @@
                                                uniqueSpecifier = specifier;
                                                prefixStr = parsedStr;
                                                parsedStr = [NSMutableString 
string];
-                        scanOptArg(scanner, &uniqueSeparator);
+                        scanOptArg(scanner, &uniqueSeparator, NULL);
                                                if (NO == [scanner 
scanUnsignedInteger:&uniqueNumber]) uniqueNumber = 1;
                                        }
                                        else {
@@ -1175,7 +1177,7 @@
     return NO;
 }
 
-static BOOL scanOptArg(NSScanner *scanner, NSString **result) {
+static BOOL scanOptArg(NSScanner *scanner, NSString **result, BOOL 
*lastCharEscaped) {
     if ([scanner scanString:@"[" intoString:NULL] == NO)
         return NO;
     
@@ -1182,14 +1184,18 @@
     NSMutableString *tmpString = nil;
     NSString *string = nil;
     unichar escapeChar;
+    BOOL wasEscaped = NO;
     while (YES) {
-        if ([scanner scanUpToCharactersFromSet:optArgStopChars 
intoString:&string] && tmpString != nil)
+        if ([scanner scanUpToCharactersFromSet:optArgStopChars 
intoString:&string] && tmpString != nil) {
             [tmpString appendString:string];
+            wasEscaped = NO;
+        }
         if ([scanner scanString:@"%" intoString:NULL] == NO || [scanner 
scanCharacter:&escapeChar] == NO)
             break;
         if (tmpString == nil)
             tmpString = [NSMutableString stringWithString:string ?: @""];
         [tmpString appendFormat:@"%C", escapeChar];
+        wasEscaped = YES;
     }
     if (tmpString)
         string = tmpString;
@@ -1196,6 +1202,8 @@
     [scanner scanString:@"]" intoString:NULL];
     if (result)
         *result = string ?: @"";
+    if (lastCharEscaped)
+        *lastCharEscaped = wasEscaped;
     return YES;
 }
 

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Bibdesk-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit

Reply via email to