I could tell you what's wrong, but if you don't already know what
the problem is, I predict you'll have many similar problems in the future.

To find out how sprintf works, find *any* book on C and read the
section on printf (sprintf is just a special version of printf).

If you don't have a C book, and don't want to buy one, I'm sure there
are many excellent web pages on printf as well.


Dennis


On Mon, 13 Jan 2003, Cameron Thompson wrote:

> *
>   * New 'who' command originally by Alander of Rivers of Mud.
>   */
> void do_who (CHAR_DATA * ch, char *argument)
> {
>      char buf[MAX_STRING_LENGTH];
>      char buf2[MAX_STRING_LENGTH];
>      BUFFER *output;
>      DESCRIPTOR_DATA *d;
>      int iClass;
>      int iRace;
>      int iClan;
>      int iLevelLower;
>      int iLevelUpper;
>      int nNumber;
>      int nMatch;
>      bool rgfClass[MAX_CLASS];
>      bool rgfRace[MAX_PC_RACE];
>      bool rgfClan[MAX_CLAN];
>      bool fClassRestrict = FALSE;
>      bool fClanRestrict = FALSE;
>      bool fClan = FALSE;
>      bool fRaceRestrict = FALSE;
>      bool fImmortalOnly = FALSE;
>
>      /*
>       * Set default arguments.
>       */
>      iLevelLower = 0;
>      iLevelUpper = MAX_LEVEL;
>      for (iClass = 0; iClass < MAX_CLASS; iClass++)
>          rgfClass[iClass] = FALSE;
>      for (iRace = 0; iRace < MAX_PC_RACE; iRace++)
>          rgfRace[iRace] = FALSE;
>      for (iClan = 0; iClan < MAX_CLAN; iClan++)
>          rgfClan[iClan] = FALSE;
>
>      /*
>       * Parse arguments.
>       */
>      nNumber = 0;
>      for (;;)
>      {
>          char arg[MAX_STRING_LENGTH];
>
>          argument = one_argument (argument, arg);
>          if (arg[0] == '\0')
>              break;
>
>          if (is_number (arg))
>          {
>              switch (++nNumber)
>              {
>                  case 1:
>                      iLevelLower = atoi (arg);
>                      break;
>                  case 2:
>                      iLevelUpper = atoi (arg);
>                      break;
>                  default:
>                      send_to_char ("Only two level numbers
> allowed.\n\r", ch);
>                      return;
>              }
>          }
>          else
>          {
>
>              /*
>               * Look for classes to turn on.
>               */
>              if (!str_prefix (arg, "immortals"))
>              {
>                  fImmortalOnly = TRUE;
>              }
>              else
>              {
>                  iClass = class_lookup (arg);
>                  if (iClass == -1)
>                  {
>                      iRace = race_lookup (arg);
>
>                      if (iRace == 0 || iRace >= MAX_PC_RACE)
>                      {
>                          if (!str_prefix (arg, "clan"))
>                              fClan = TRUE;
>                          else
>                          {
>                              iClan = clan_lookup (arg);
>                              if (iClan)
>                              {
>                                  fClanRestrict = TRUE;
>                                  rgfClan[iClan] = TRUE;
>                              }
>                              else
>                              {
>                                  send_to_char
>                                      ("That's not a valid race, class,
> or clan.\n\r",
>                                       ch);
>                                  return;
>                              }
>                          }
>                      }
>                      else
>                      {
>                          fRaceRestrict = TRUE;
>                          rgfRace[iRace] = TRUE;
>                      }
>                  }
>                  else
>                  {
>                      fClassRestrict = TRUE;
>                      rgfClass[iClass] = TRUE;
>                  }
>              }
>          }
>      }
>
>      /*
>       * Now show matching chars.
>       */
>      nMatch = 0;
>      buf[0] = '\0';
>      output = new_buf ();
>      for (d = descriptor_list; d != NULL; d = d->next)
>      {
>          CHAR_DATA *wch;
>
>
>          /*
>           * Check for match against restrictions.
>           * Don't use trust as that exposes trusted mortals.
>           */
>          if (d->connected != CON_PLAYING || !can_see (ch, d->character))
>              continue;
>
>          wch = (d->original != NULL) ? d->original : d->character;
>
>          if (!can_see (ch, wch))
>              continue;
>
>          if (wch->level < iLevelLower
>              || wch->level > iLevelUpper
>              || (fImmortalOnly && wch->level < LEVEL_IMMORTAL)
>              || (fClassRestrict && !rgfClass[wch->class])
>              || (fRaceRestrict && !rgfRace[wch->race])
>              || (fClan && !is_clan (wch))
>              || (fClanRestrict && !rgfClan[wch->clan]))
>              continue;
>
>          nMatch++;
>
>
>          /*
>           * Format it up.
>           */
>          sprintf (buf, "[%2d %6s %s] %s%s%s%s%s%s%s%s\n\r",
>                   wch->level,
>                   wch->race < MAX_PC_RACE ?
> pc_race_table[wch->race].who_name
>                   : "     ",
>                   wch->incog_level >= LEVEL_HERO ? "(Incog) " : "",
>                   wch->invis_level >= LEVEL_HERO ? "(Wizi) " : "",
>                   clan_table[wch->clan].who_name,
>                   IS_SET (wch->comm, COMM_AFK) ? "[AFK] " : "",
>                   IS_SET (wch->act, PLR_KILLER) ? "(KILLER) " : "",
>                   IS_SET (wch->act, PLR_THIEF) ? "(THIEF) " : "",
>                   wch->name, IS_NPC (wch) ? "" : wch->pcdata->title);
>          add_buf (output, buf);
>      }
>
>      sprintf (buf2, "\n\rPlayers found: %d\n\r", nMatch);
>      add_buf (output, buf2);
>      page_to_char (buf_string (output), ch);
>      free_buf (output);
>      return;
> }
>
>
> Now I feel like a fool.


Reply via email to