docs: public String convertMA0CToSIB(String ma0cTopic) throws ParseException
     {
       if (TraceComponent.isAnyTracingEnabled() && tcInt.isEntryEnabled()) SibTr.entry(this, tcInt, "convertMA0CToSIB",ma0cTopic);
  
       // throw exception if topic contains '?' character
       if(ma0cTopic.indexOf("?") != -1)
       {
         throw new ParseException(nls.getFormattedMessage(("INVALID_WILDCARD_CHAR_CWSIU0011"),
                                      new Object [] {"?", ma0cTopic},
                                      null), 0);
       }
  
       // simple instance of conversion from '*' to '//*'
       //   also has a hand in */A --> //*/A.
       if(ma0cTopic.startsWith("*"))
       {
         // This slightly odd construct is further processed below
         // to give the expected results.
         ma0cTopic = "/"+ma0cTopic;
       }
  
       // Throw exception if topic contains a '*' which
       // isn't surrounded by separator characters.
       int startAt = 0;
       int newStartAt;
       while((newStartAt = ma0cTopic.indexOf("*", startAt)) != -1)
       {
  
         boolean isInvalid = false;
  
         // First rule is that your * character must be preceeded and
         // postceeded by a / character (except for where the * is the
         // beginning or end respectively).
         if (newStartAt > 0)
         {
           // Check that the preceeding character is a /
           char prevChar = ma0cTopic.charAt(newStartAt-1);
  
           if (prevChar != '/')
           {
             isInvalid = true;
             if (TraceComponent.isAnyTracingEnabled() && tcInt.isDebugEnabled()) SibTr.debug(this, tcInt, "Invalid MA0C topic - * is not preceeded by /");
           }//if not /
  
         }//if not start character
  
         // If the * is not the last character.
         if (newStartAt < ma0cTopic.length()-1)
         {
           // Check the following character is a /
           char afterChar = ma0cTopic.charAt(newStartAt+1);
  
           if (afterChar != '/')
           {
             isInvalid = true;
             if (TraceComponent.isAnyTracingEnabled() && tcInt.isDebugEnabled()) SibTr.debug(this, tcInt, "Invalid MA0C topic - * is not followed by /");
           }//if not /
  
         }//if not end character
  
         if (isInvalid)
         {
           // This will be driven if the * is not preceeded and followed
           // by a /
           throw new ParseException(nls.getFormattedMessage(("INVALID_ASTERIX_WILDCARD_CWSIU0012"),
                                               new Object [] {ma0cTopic},
                                               null), 0);
         }
  
         // Now any * characters must be converted to /*
         ma0cTopic = ma0cTopic.substring(0, newStartAt) + "/" +
                      ma0cTopic.substring(newStartAt, ma0cTopic.length());
  
         // Now skip over the extra character that we just added, and the original
         // * that we found.
         startAt = newStartAt + 2;
  
       } // end of while
  
       if (TraceComponent.isAnyTracingEnabled() && tcInt.isEntryEnabled()) SibTr.exit(this, tcInt, "convertMA0CToSIB",ma0cTopic);
       return ma0cTopic;
     }