docs: protected IWord enSecondSeg( IWord w, boolean retfw ) 
      {
          isb.clear();
          char[] chars = w.getValue().toCharArray();
          int _TYPE = StringUtil.getEnCharType(chars[0]);
          int _ctype, start = 0, j, p = 0;
          
          isb.append(chars[0]);
          IWord sword = null, fword = null;    //first word
          String _str = null;
          
          for ( j = 1; j < chars.length; j++ ) {
              /* get the char type.
               * It could only be one of 
               * EN_LETTER, EN_NUMERIC, EN_PUNCTUATION.
              */
              _ctype = StringUtil.getEnCharType(chars[j]);
              if ( _ctype == StringUtil.EN_PUNCTUATION ) {
                  _TYPE = StringUtil.EN_PUNCTUATION;
                  p++;
                  continue;
              }
              
              if ( _ctype == _TYPE ) {
                  isb.append(chars[j]);
              } else {
                  start = j - isb.length() - p;
                  
                  /* If the number of chars is larger than
                   *  config.EN_SSEG_LESSLEN we create a new IWord
                   * and add to the wordPool.
                  */
                  if ( isb.length() >= config.STOKEN_MIN_LEN ) {
                      _str = isb.toString();
                      if ( ! ( config.CLEAR_STOPWORD
                              && dic.match(ILexicon.STOP_WORD, _str) ) ) {
                          sword = new Word(_str, w.getType());
                          sword.setPartSpeech(w.getPartSpeech());
                          sword.setPosition(w.getPosition() + start);
                          if ( retfw && fword == null ) fword = sword;
                          else wordPool.add(sword);
                      }
                  }
                  
                  isb.clear();
                  isb.append(chars[j]);
                  p = 0;
                  _TYPE = _ctype;
              }
          }
          
          //Continue to check the last item
          if ( isb.length() >= config.STOKEN_MIN_LEN ) {
              start = j - isb.length() - p;
              _str = isb.toString();
              
              if ( ! ( config.CLEAR_STOPWORD
                      && dic.match(ILexicon.STOP_WORD, _str) ) ) {
                  sword = new Word(_str, w.getType());
                  sword.setPartSpeech(w.getPartSpeech());
                  sword.setPosition(w.getPosition() + start);
                  if ( retfw && fword == null ) fword = sword;
                  else wordPool.add(sword);
              }
          }
          
          chars = null;    //Let gc do its work.
  
          return fword;
      }