rem: Word = PrefixString; Word.append (ProtocolStringPntr,
add: Word.assign (ProtocolStringPntr,
context: static size_t TokenizerPassExtractURLs (  char *BufferPntr,  size_t NumberOfBytes,  char PrefixCharacter,  set<string> &WordSet){  char   *AtSignStringPntr;  char   *HostStringPntr;  char   *InputStringEndPntr;  char   *InputStringPntr;  char   *OptionsStringPntr;  char   *PathStringPntr;  char    PrefixString [2];  char   *ProtocolStringPntr;  string  Word;  InputStringPntr = BufferPntr;  InputStringEndPntr = BufferPntr + NumberOfBytes;  PrefixString [0] = PrefixCharacter;  PrefixString [1] = 0;  while (InputStringPntr < InputStringEndPntr - 4)  {    HostStringPntr = NULL;    if (memcmp (InputStringPntr, "www.", 4) == 0)      HostStringPntr = InputStringPntr;    else if (memcmp (InputStringPntr, "://", 3) == 0)    {      /* Find the protocol name, and add it as a word such as "ftp:" "http:" */      ProtocolStringPntr = InputStringPntr;      while (ProtocolStringPntr > BufferPntr &&      isalpha (ProtocolStringPntr[-1]))        ProtocolStringPntr--;      Word = PrefixString;      Word.append (ProtocolStringPntr,        (InputStringPntr - ProtocolStringPntr) + 1 /* for the colon */);      if (!Word.empty ())        WordSet.insert (Word);      HostStringPntr = InputStringPntr + 3; /* Skip past the "://" */    }    if (HostStringPntr == NULL)    {      InputStringPntr++;      continue;    }    /* Got a host name string starting at HostStringPntr.  It's everything    until the next slash or space, like "user:password@computer:port". */    InputStringPntr = HostStringPntr;    AtSignStringPntr = NULL;    while (InputStringPntr < InputStringEndPntr &&    (*InputStringPntr != '/' && !isspace (*InputStringPntr)))    {      if (*InputStringPntr == '@')        AtSignStringPntr = InputStringPntr;      InputStringPntr++;    }    if (AtSignStringPntr != NULL)    {      /* Add a word with the user and password, unseparated. */      Word = PrefixString;      Word.append (HostStringPntr,        AtSignStringPntr - HostStringPntr + 1 /* for the @ sign */);      if (!Word.empty ())        WordSet.insert (Word);      HostStringPntr = AtSignStringPntr + 1;    }    /* Add a word with the computer and port, unseparated. */    Word = PrefixString;    Word.append (HostStringPntr, InputStringPntr - HostStringPntr);    if (!Word.empty ())      WordSet.insert (Word);    /* Now get the path name, not including the extra junk after ?  and #    separators (they're stored as separate options).  Stops at white space or a    double quote mark. */    PathStringPntr = InputStringPntr;    OptionsStringPntr = NULL;    while (InputStringPntr < InputStringEndPntr &&    (*InputStringPntr != '"' && !isspace (*InputStringPntr)))    {      if (OptionsStringPntr == NULL &&      (*InputStringPntr == '?' || *InputStringPntr == '#'))        OptionsStringPntr = InputStringPntr;      InputStringPntr++;    }    if (OptionsStringPntr == NULL)    {      /* No options, all path. */      Word = PrefixString;      Word.append (PathStringPntr, InputStringPntr - PathStringPntr);      if (!Word.empty ())        WordSet.insert (Word);    }    else    {      /* Insert the path before the options. */      Word = PrefixString;      Word.append (PathStringPntr, OptionsStringPntr - PathStringPntr);      if (!Word.empty ())        WordSet.insert (Word);      /* Insert all the options as a word. */      Word = PrefixString;      Word.append (OptionsStringPntr, InputStringPntr - OptionsStringPntr);      if (!Word.empty ())        WordSet.insert (Word);    }  }  return NumberOfBytes;}