Revision: 22460
          http://sourceforge.net/p/bibdesk/svn/22460
Author:   hofman
Date:     2018-07-23 17:43:11 +0000 (Mon, 23 Jul 2018)
Log Message:
-----------
Dash (minus) is an escaped character for format. Convenience functions for 
scanning optional arguments in format.

Modified Paths:
--------------
    trunk/bibdesk/BDSKFormatParser.m
    trunk/bibdesk/BibDesk.help/Contents/Resources/English.lproj/bibdesk.texi

Modified: trunk/bibdesk/BDSKFormatParser.m
===================================================================
--- trunk/bibdesk/BDSKFormatParser.m    2018-07-23 17:25:19 UTC (rev 22459)
+++ trunk/bibdesk/BDSKFormatParser.m    2018-07-23 17:43:11 UTC (rev 22460)
@@ -75,6 +75,7 @@
 static inline BOOL stringHasCharacterNotInRange(NSString *string, NSRange 
range);
 
 static BOOL scanOptArg(NSScanner *scanner, NSString **result, NSString 
*defaultResult);
+static BOOL scanSignedDigit(NSScanner *scanner, NSUInteger *resultDigit, BOOL 
*resultSign);
 
 + (void)initialize {
     BDSKINITIALIZE;
@@ -83,7 +84,7 @@
     validParamSpecifierChars = [[NSCharacterSet 
characterSetWithCharactersInString:@"aApPtTkfwciuUn"] retain];
     validUniqueSpecifierChars = [[NSCharacterSet 
characterSetWithCharactersInString:@"uUn"] retain];
     validLocalFileSpecifierChars = [[NSCharacterSet 
characterSetWithCharactersInString:@"lLeE"] retain];
-    validEscapeSpecifierChars = [[NSCharacterSet 
characterSetWithCharactersInString:@"0123456789%[]"] retain];
+    validEscapeSpecifierChars = [[NSCharacterSet 
characterSetWithCharactersInString:@"0123456789%[]-"] retain];
     validArgSpecifierChars = [[NSCharacterSet 
characterSetWithCharactersInString:@"fwcsi"] retain];
     validOptArgSpecifierChars = [[NSCharacterSet 
characterSetWithCharactersInString:@"aApPTEkfwsuUn"] retain];
     validOptArg3SpecifierChars = [[NSCharacterSet 
characterSetWithCharactersInString:@"APws"] retain];
@@ -149,24 +150,9 @@
                                        if (NO == [scanner isAtEnd]) {
                                                // look for [separator] and 
[etal]
                         scanOptArg(scanner, &authSep, @"") && 
scanOptArg(scanner, &etal, @"");
-                                               if ([scanner 
peekCharacter:&nextChar]) {
-                                                       // look for #names
-                            if (nextChar == '-') {
-                                [scanner setScanLocation:[scanner 
scanLocation]+1];
-                                if ([scanner peekCharacter:&nextChar] && 
[[NSCharacterSet decimalDigitCharacterSet] characterIsMember:nextChar]) {
-                                    isLast = YES;
-                                } else {
-                                    [scanner setScanLocation:[scanner 
scanLocation]-1];
-                                    nextChar = '-';
-                                }
-                            }
-                            if ([[NSCharacterSet decimalDigitCharacterSet] 
characterIsMember:nextChar]) {
-                                                               [scanner 
setScanLocation:[scanner scanLocation]+1];
-                                                               numAuth = 
(NSUInteger)(nextChar - '0');
-                                                               // scan for 
#chars per name
-                                                               if (NO == 
[scanner scanUnsignedInteger:&numChars]) numChars = 0;
-                                                       }
-                                               }
+                        // look for #names and #chars per name
+                        if (scanSignedDigit(scanner, &numAuth, &isLast))
+                            if (NO == [scanner scanUnsignedInteger:&numChars]) 
numChars = 0;
                                        }
                                        NSArray *authArray = [pub 
peopleArrayForField:BDSKAuthorString];
                                        if ([authArray count] == 0 && specifier 
== 'p') {
@@ -213,22 +199,8 @@
                                        if (NO == [scanner isAtEnd]) {
                                                // look for [author separator], 
[name separator], and [etal]
                         scanOptArg(scanner, &authSep, @"") && 
scanOptArg(scanner, &nameSep, @"") && scanOptArg(scanner, &etal, @"");
-                                               if ([scanner 
peekCharacter:&nextChar]) {
-                                                       // look for #names
-                            if (nextChar == '-') {
-                                [scanner setScanLocation:[scanner 
scanLocation]+1];
-                                if ([scanner peekCharacter:&nextChar] && 
[[NSCharacterSet decimalDigitCharacterSet] characterIsMember:nextChar]) {
-                                    isLast = YES;
-                                } else {
-                                    [scanner setScanLocation:[scanner 
scanLocation]-1];
-                                    nextChar = '-';
-                                }
-                            }
-                                                       if ([[NSCharacterSet 
decimalDigitCharacterSet] characterIsMember:nextChar]) {
-                                                               [scanner 
setScanLocation:[scanner scanLocation]+1];
-                                                               numAuth = 
(NSUInteger)(nextChar - '0');
-                                                       }
-                                               }
+                        // look for #names
+                        scanSignedDigit(scanner, &numAuth, &isLast);
                                        }
                                        NSArray *authArray = [pub 
peopleArrayForField:BDSKAuthorString];
                                        if ([authArray count] == 0 && specifier 
== 'P') {
@@ -1224,4 +1196,27 @@
     return YES;
 }
 
+static BOOL scanSignedDigit(NSScanner *scanner, NSUInteger *resultDigit, BOOL 
*resultSign) {
+    unichar nextChar;
+    BOOL isNeg = NO;
+    if ([scanner peekCharacter:&nextChar]) {
+        if (nextChar == '-') {
+            [scanner setScanLocation:[scanner scanLocation]+1];
+            if ([scanner peekCharacter:&nextChar] && [[NSCharacterSet 
decimalDigitCharacterSet] characterIsMember:nextChar]) {
+                isNeg = YES;
+            } else {
+                [scanner setScanLocation:[scanner scanLocation]-1];
+                nextChar = '-';
+            }
+        }
+        if ([[NSCharacterSet decimalDigitCharacterSet] 
characterIsMember:nextChar]) {
+            [scanner setScanLocation:[scanner scanLocation]+1];
+            if (resultDigit) *resultDigit = (NSUInteger)(nextChar - '0');
+            if (resultSign) *resultSign = isNeg;
+            return YES;
+        }
+    }
+    return NO;
+}
+
 @end

Modified: 
trunk/bibdesk/BibDesk.help/Contents/Resources/English.lproj/bibdesk.texi
===================================================================
--- trunk/bibdesk/BibDesk.help/Contents/Resources/English.lproj/bibdesk.texi    
2018-07-23 17:25:19 UTC (rev 22459)
+++ trunk/bibdesk/BibDesk.help/Contents/Resources/English.lproj/bibdesk.texi    
2018-07-23 17:43:11 UTC (rev 22460)
@@ -3817,6 +3817,8 @@
 @tab Escaped square bracket (if allowed)
 @item @spec{%]}
 @tab Escaped square bracket (if allowed)
+@item @spec{%-}
+@tab Escaped dash (if allowed)
 @end multitable
 @noindent
 In the table above, @value{paramdescr} characters after the specifiers 

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