Bug 426727: fix logging placeholder calculation
diff --git a/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/inject/LoggingExample.java b/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/inject/LoggingExample.java
index 3b658f2..4d02a17 100644
--- a/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/inject/LoggingExample.java
+++ b/org.eclipse.sisu.inject.tests/src/org/eclipse/sisu/inject/LoggingExample.java
@@ -43,6 +43,7 @@
         Logs.trace( "{}{}", "a", "b" );
         Logs.trace( "{{}}{{}}", null, null );
         Logs.trace( "{}-{}", "a", "b" );
+        Logs.trace( "<>-{}", "a", "b" );
 
         Logs.trace( "{} {}", new BadValue(), new BadValue() );
 
@@ -64,6 +65,7 @@
         Logs.warn( "{}{}", "a", "b" );
         Logs.warn( "{{}}{{}}", null, null );
         Logs.warn( "{}-{}", "a", "b" );
+        Logs.warn( "<>-{}", "a", "b" );
 
         Logs.warn( "{} {}", new BadValue(), new BadValue() );
 
diff --git a/org.eclipse.sisu.inject/src/org/eclipse/sisu/inject/Logs.java b/org.eclipse.sisu.inject/src/org/eclipse/sisu/inject/Logs.java
index f6018ec..a4420cd 100644
--- a/org.eclipse.sisu.inject/src/org/eclipse/sisu/inject/Logs.java
+++ b/org.eclipse.sisu.inject/src/org/eclipse/sisu/inject/Logs.java
@@ -226,19 +226,28 @@
      */
     private static String format( final String format, final Object arg )
     {
+        final int len = format.length();
         boolean detailed = true;
-        int cursor = format.indexOf( "{}" ); // replaced with String.valueOf
-        if ( cursor < 0 )
+        int cursor = 0;
+        for ( char prevChar = ' ', currChar; cursor < len; prevChar = currChar, cursor++ )
         {
-            cursor = format.indexOf( "<>" ); // use identityToString instead
-            detailed = false;
+            currChar = format.charAt( cursor );
+            if ( prevChar == '{' && currChar == '}' )
+            {
+                break; // replace anchor with String.valueOf
+            }
+            if ( prevChar == '<' && currChar == '>' )
+            {
+                detailed = false;
+                break; // use Logs.identityToString instead
+            }
         }
-        if ( cursor < 0 )
+        if ( cursor >= len )
         {
             return format;
         }
         final StringBuilder buf = new StringBuilder();
-        if ( cursor > 0 )
+        if ( --cursor > 0 )
         {
             buf.append( format.substring( 0, cursor ) );
         }
@@ -251,9 +260,9 @@
             buf.append( e );
         }
         cursor += 2;
-        if ( cursor < format.length() )
+        if ( cursor < len )
         {
-            buf.append( format.substring( cursor, format.length() ) );
+            buf.append( format.substring( cursor, len ) );
         }
         return buf.toString();
     }