Board code from FTP site

From: Sliver (sliver@home.com)
Date: 01/31/00


I got the board code from the ftp site, and I'm having a small problem
with it. I tried to adapt it to the new style bpl16 code, but whenever
you type anything in the same room as the board, the mud crashes, with
this in the syslog:

SYSERR: malloc failure: Cannot allocate memory

What could the problem be?

--BEGIN CHANGES--

in void init_boards(void)
.
.
    }
    Board_load_board(i);
  }

  ACMD_READ = find_command("read");
  ACMD_WRITE = find_command("write");
  ACMD_REMOVE = find_command("remove");
  ACMD_LOOK = find_command("look");
  ACMD_EXAMINE = find_command("examine");
+  ACMD_RESPOND = find_command("respond");

  if (fatal_error)
.
.

in SPECIAL(gen_board)
{
.
.
  }
  if (!ch->desc)
    return (0);

  if (cmd != ACMD_WRITE && cmd != ACMD_LOOK && cmd != ACMD_EXAMINE &&
++      cmd != ACMD_READ && cmd != ACMD_REMOVE && cmd != ACMD_RESPOND)
    return (0);

  if ((board_type = find_board(ch)) == -1) {
    log("SYSERR:  degenerate board!  (what the hell...)");
    return (0);
  }
  if (cmd == ACMD_WRITE)
    return (Board_write_message(board_type, ch, argument, board));
+  else if (cmd == ACMD_RESPOND)
+   return (Board_respond_message(board_type, ch, argument, board));
  else if (cmd == ACMD_LOOK || cmd == ACMD_EXAMINE)
    return (Board_show_board(board_type, ch, argument, board));

in Board_show_board
.
.
    for (i = 0; i < num_of_msgs[board_type]; i++)
#endif
    {
      if (MSG_HEADING(board_type, i)) {
+        if(MSG_REPLY(board_type, i) == -1)
+          Board_display_response(board_type, i, buf);
      } else {
        log("SYSERR: The board is fubar'd.");
        send_to_char("Sorry, the board isn't working.\r\n", ch);
        return (1);
.
.

void Board_display_response(int board_type, int slot_num, char *output)
{
  int k;
  char buf[MAX_STRING_LENGTH];

  sprintf(buf, "%-2d : %s\r\n", slot_num + 1, MSG_HEADING(board_type,
slot_num));
  strcat(output, buf);
  for (k = slot_num; k < num_of_msgs[board_type]; k++)
    if (MSG_REPLY(board_type, k) == slot_num)
      Board_display_response(board_type, k, output);
}

int Board_respond_message(int board_type, struct char_data * ch, char
*arg, struct obj_data *board)
{
  char *tmstr;
  int len, msg, ind;
  time_t ct;
  char buf[MAX_INPUT_LENGTH], buf2[MAX_INPUT_LENGTH];
  char number[MAX_STRING_LENGTH];

  one_argument(arg, number);

  if (GET_LEVEL(ch) < WRITE_LVL(board_type)) {
    send_to_char("You are not holy enough to write on this board.\r\n",
ch);
    return (1);
  }
  if (num_of_msgs[board_type] >= MAX_BOARD_MESSAGES) {
    send_to_char("The board is full.\r\n", ch);
    return (1);
  }
  if ((NEW_MSG_INDEX(board_type).slot_num = find_slot()) == -1) {
    send_to_char("The board is malfunctioning - sorry.\r\n", ch);
    log("SYSERR: Board: failed to find empty slot on write.");
    return (1);
  }
  if(!*number) {
    send_to_char("You must respond to something!\r\n", ch);
    return(1);
  }

  if(!isdigit(*number) || (!(msg = atoi(number)))) {
    send_to_char("What are you trying to respond to?\r\n", ch);
    return(1);
  }

  if(GET_LEVEL(ch) < READ_LVL(board_type)) {
    send_to_char("You try but fail to understand the holy words.\r\n",
ch);
    return(1);
  }

  if(msg < 1 || msg > num_of_msgs[board_type]) {
    send_to_char("That message exists only in your imagination.\r\n",
ch);
    return(1);
  }

  ind = msg -1;

  if(MSG_SLOTNUM(board_type, ind) < 0 ||
     MSG_SLOTNUM(board_type, ind) >= INDEX_SIZE) {
    send_to_char("Sorry, the board is not working.\r\n", ch);
    log("SYSERR: Board is screwed up.");
    return(1);
  }

  if(!(MSG_HEADING(board_type, ind))) {
    send_to_char("That message appears to be screwed up.\r\n", ch);
    return(1);
  }

  ct = time(0);
  tmstr = (char *) asctime(localtime(&ct));
  *(tmstr + strlen(tmstr) - 1) = '\0';

  sprintf(buf2, "(%s)", GET_NAME(ch));
  sprintf(buf, "%6.10s %-12s :: Re: %s", tmstr, buf2,
(MSG_HEADING(board_type, ind) + 27));

  buf[81] = '\0';

  len = strlen(buf) +1;

  if(!(NEW_MSG_INDEX(board_type).heading = (char *) malloc(sizeof(char)
* len))) {
    send_to_char("The board is malfucntioning - sorry.\r\n", ch);
    return(1);
  }

  strcpy(NEW_MSG_INDEX(board_type).heading, buf);
  NEW_MSG_INDEX(board_type).heading[len - 1] = '\0';
  NEW_MSG_INDEX(board_type).level = GET_LEVEL(ch);
  NEW_MSG_INDEX(board_type).reply_num = ind;

  send_to_char("Write your message.  Terminate with a @ on a new
line.\r\n\r\n", ch);
  act("$n starts to write a message.", TRUE, ch, 0, 0, TO_ROOM);

  string_write(ch->desc,
&(msg_storage[NEW_MSG_INDEX(board_type).slot_num]),
                MAX_MESSAGE_LENGTH, board_type + BOARD_MAGIC, NULL);

  num_of_msgs[board_type]++;
  return (1);
}

Plus various other things in boards.h

Thanks
Sliver


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     |  http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html  |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 04/10/01 PDT