Example #1
0
void greet_memory_mtrigger(char_data *actor)
{
  trig_data *t;
  char_data *ch;
  struct script_memory *mem;
  char buf[MAX_INPUT_LENGTH];
  int command_performed = 0;

  for (ch = world[IN_ROOM(actor)].people; ch; ch = ch->next_in_room) {
    if (!SCRIPT_MEM(ch) || !AWAKE(ch) || FIGHTING(ch) || (ch == actor) || 
	AFF_FLAGGED(ch, AFF_CHARM))
      continue;

    /* find memory line with command only */
    for (mem = SCRIPT_MEM(ch); mem && SCRIPT_MEM(ch); mem=mem->next) {
      if (GET_ID(actor)!=mem->id) continue;
      if (mem->cmd) {
        command_interpreter(ch, mem->cmd); /* no script */
        command_performed = 1;
        break;
      }
    }

    /* if a command was not performed execute the memory script */
    if (mem && !command_performed) {
      for (t = TRIGGERS(SCRIPT(ch)); t; t = t->next) {
        if (IS_SET(GET_TRIG_TYPE(t), MTRIG_MEMORY) &&
            CAN_SEE(ch, actor) &&
            !GET_TRIG_DEPTH(t) &&
            number(1, 100) <= GET_TRIG_NARG(t)) {
              ADD_UID_VAR(buf, t, actor, "actor", 0);
              script_driver(ch, t, MOB_TRIGGER, TRIG_NEW);
              break;
        }
      }
    }

    /* delete the memory */
    if (mem) {
      if (SCRIPT_MEM(ch)==mem) {
        SCRIPT_MEM(ch) = mem->next;
      } else {
        struct script_memory *prev;
        prev = SCRIPT_MEM(ch);
        while (prev->next != mem) prev = prev->next;
        prev->next = mem->next;
      }
      if (mem->cmd) free(mem->cmd);
      free(mem);
    }
  }
}
Example #2
0
void entry_memory_mtrigger(char_data *ch)
{
  trig_data *t;
  char_data *actor;
  struct script_memory *mem;
  char buf[MAX_INPUT_LENGTH];

  if (!SCRIPT_MEM(ch) || AFF_FLAGGED(ch, AFF_CHARM))
    return;


  for (actor = world[IN_ROOM(ch)].people; actor && SCRIPT_MEM(ch);
       actor = actor->next_in_room) {
    if (actor!=ch && SCRIPT_MEM(ch)) {
      for (mem = SCRIPT_MEM(ch); mem && SCRIPT_MEM(ch); mem = mem->next) {
        if (GET_ID(actor)==mem->id) {
          struct script_memory *prev;
          if (mem->cmd) command_interpreter(ch, mem->cmd);
          else {
            for (t = TRIGGERS(SCRIPT(ch)); t; t = t->next) {
              if (TRIGGER_CHECK(t, MTRIG_MEMORY) && (number(1, 100) <=
                  GET_TRIG_NARG(t))){
                ADD_UID_VAR(buf, t, actor, "actor", 0);
                script_driver(ch, t, MOB_TRIGGER, TRIG_NEW);
                break;
              }
            }
          }
          /* delete the memory */
          if (SCRIPT_MEM(ch)==mem) {
            SCRIPT_MEM(ch) = mem->next;
          } else {
            prev = SCRIPT_MEM(ch);
            while (prev->next != mem) prev = prev->next;
            prev->next = mem->next;
          }
          if (mem->cmd) free(mem->cmd);
          free(mem);
        }
      } /* for (mem =..... */
    }
  }
}
void * FTP_gateway(void *data)
{
    int                 sockfd = *((int *)data);
    int                 readn;
    socklen_t           addrlen;
    char                RAW_command[MAXLINE], debugbuf[MAXLINE];
    int                 current_code, previous_code = 0;
    char*               FTP_banner  =   "220 My FTP SERVER 1.0\r\n";
    struct sockaddr_in  client_addr;
    char                loginID[30];
    FTPinfo             FTP_information;
    int                 debug_count= 0;
    // initilize
    memset(&FTP_information, 0x00, sizeof(FTP_information));
    getcwd(FTP_information.execute_location, BUFSIZE);
    FTP_information.controlsockfd   =   sockfd;
        /* for debug */
//    chdir("/Users/tracking/Desktop/REAL_FTP/REAL_FTP");
//    getcwd(RAW_command, MAXLINE);
//    printf("%s\n", RAW_command);
        /* for debug */
    
        /* for debug */
    addrlen = sizeof(client_addr);
    getpeername(sockfd, (struct sockaddr *)&client_addr, &addrlen);
        /* for debug */
    
    /*          FTP banner!!!           */
    write(sockfd, FTP_banner, strlen(FTP_banner));
    
    
    while((readn = read(sockfd, FTP_information.RAW_command, MAXLINE)) > 0)
    {
        
        // receive user command.

        sprintf(debugbuf, "Read Data %s(%d) : %s", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), FTP_information.RAW_command);
        write(STDOUT_FILENO, debugbuf, strlen(debugbuf));
        
        
        current_code = command_interpreter(&FTP_information);

        //write(FTP_information->controlsockfd, FTP_information.response_code,
            //strlen(FTP_information.response_code)); // send response.
        
        previous_code   =   current_code;
        
        // data transfer is going to start shortly.
        if( strcmp(FTP_information.RAW_command, "PORT") == 0)
        {
            /*
            // on failure, send "cannot open data connection." I need return value.
            active_open(&FTP_information);

            // on failure, I would send the message "cannot open connection.".
            strcpy(FTP_information.response_code, "150 Data Connection OK\r\n");
            write(sockfd, FTP_information.response_code,
                  strlen(FTP_information.response_code)); // send response.
            
            // on success, send data transfer complete.
            Data_gateway(&FTP_information);
            
            close(FTP_information.datasockfd); // trasnfer complete.
            
            write(sockfd, FTP_information.response_code,
                  strlen(FTP_information.response_code)); // send response.
            
            */
            
            
        }
        else if( strcmp(FTP_information.RAW_command, "PASV") == 0)
        {
            /*
            passive_open(&FTP_information);
            
            // on failure, I would send the message "cannot open connection.".
            strcpy(FTP_information.response_code, "150 Data Connection OK\r\n");
            write(sockfd,
                  FTP_information.response_code,
                  strlen(FTP_information.response_code)); // send response.

            // on success, send data transfer complete.
            Data_gateway(&FTP_information);
            close(FTP_information.datasockfd); // trasnfer complete.
            
            write(sockfd, FTP_information.response_code,
                  strlen(FTP_information.response_code)); // send response.
             */
        }
        
        
        memset(FTP_information.RAW_command, 0x00, MAXLINE); // get comamnd-buffer clean.
        memset(FTP_information.response_code, 0x00, MAXLINE); // get response-buffer clean.
        debug_count++;
        memset(debugbuf, 0x00, MAXLINE);
    }
    close(sockfd);
    
    
    printf("worker thread end\n");
    return 0;
}
Example #4
0
void
command_interpreter (CHAR_DATA * ch, char *argument)
{
	char buf[MAX_STRING_LENGTH];
	char *command_args, *p, *social_args;
	int cmd_level = 0;
	int i = 0, echo = 1;
	AFFECTED_TYPE *craft_affect = NULL;
	AFFECTED_TYPE *af;
	ALIAS_DATA *alias;
	extern int second_affect_active;

	if (!ch)
		return;

	*buf = '\0';

	p = argument;

	while (*p == ' ')
		p++;

	if (strchr (p, '%'))
	{
		send_to_char ("Input with the '%' character is not permitted.\n", ch);
		return;
	}

	if (strchr (p, '#') && IS_MORTAL (ch) && strncmp (p, "ge", 2) != 0
		&& strncmp (p, "buy", 3) != 0)
	{
		send_to_char ("Input with the '#' character is not permitted.\n", ch);
		return;
	}

	if (IS_MORTAL (ch) && strchr (p, '$'))
	{
		send_to_char ("Input with the '$' character is not permitted.\n", ch);
		return;
	}

	std::multimap<int, room_prog>::iterator it;
	if (IS_NPC(ch))
		it = mob_prog_list.find(ch->mob->nVirtual); 
	if (IS_NPC(ch) && !get_second_affect (ch, SA_DOANYWAY, 0) && it != mob_prog_list.end())
	{
		if (m_prog(ch, p))
		{
			return;
		}
	}
	std::pair<std::multimap<int, room_prog>::iterator, std::multimap<int, room_prog>::iterator> pair;

	if (ch->right_hand && !get_second_affect (ch, SA_DOANYWAY, 0))
	{
		pair = obj_prog_list.equal_range(ch->right_hand->nVirtual);
		for (it = pair.first; it != pair.second; it++)
		{
			if (it->second.type != 1 && it->second.type != 3 && it->second.type != 5)
				continue;
			if (o_prog(ch, p, it->second))
				return;
		}
	}
	if (ch->left_hand && !get_second_affect (ch, SA_DOANYWAY, 0))
	{
		pair = obj_prog_list.equal_range(ch->left_hand->nVirtual);
		for (it = pair.first; it != pair.second; it++)
		{
			if (it->second.type != 1 && it->second.type != 3 && it->second.type != 5)
				continue;
			if (o_prog(ch, p, it->second))
				return;
		}
	}
	for (OBJ_DATA *tobj = ch->equip; tobj; tobj = tobj->next_content)
	{
		if (get_second_affect (ch, SA_DOANYWAY, 0))
			break;

		pair = obj_prog_list.equal_range(tobj->nVirtual);
		for (it = pair.first; it != pair.second; it++)
		{
			if (it->second.type != 2 && it->second.type != 3 && it->second.type != 5)
				continue;
			if (o_prog(ch, p, it->second))
				return;
		}

	}

	/* this is where it crashes on the hour - Grommit */

	if (!ch->room )
	{
		std::ostringstream stream;
		stream << "Error in command_interpreter:commands.cpp. Command \"" << 
			argument << "\" called by \"" << ch->tname << "\" with null room. Previously in "
			<< (ch->last_room) << " entering null room from the " << (dirs[ch->from_dir]) << ".";

		system_log(stream.str().c_str(),true);
		return;
	}

	/* end grommit diagnostics to avoid segfaulting on the below for loop */

	for (OBJ_DATA *tobj = ch->room->contents; tobj; tobj = tobj->next_content)
	{
		if (get_second_affect (ch, SA_DOANYWAY, 0))
			break;

		pair = obj_prog_list.equal_range(tobj->nVirtual);
		for (it = pair.first; it != pair.second; it++)
		{
			if (it->second.type != 4 && it->second.type != 5)
				continue;
			if (o_prog(ch, p, it->second))
				return;
		}

	}

	for (CHAR_DATA *temp_char = ch->room->people; temp_char; temp_char = temp_char->next_in_room)
	{
		if (get_second_affect (ch, SA_DOANYWAY, 0))
			break;

		if (temp_char == ch)
			continue;

		if (!IS_NPC(temp_char))
			continue;

		pair = mob_prog_list.equal_range(temp_char->mob->nVirtual);

		for (it = pair.first; it != pair.second; ++it)
		{
			if (m_prog(ch, p, it->second))
				return;
		}
	}

	if (ch->room && ch->room->prg && !get_second_affect(ch, SA_DOANYWAY, 0) && r_program (ch, p))
	{
		if (!IS_NPC (ch)
			|| (ch->desc && (ch->pc && str_cmp (ch->pc->account_name, "Guest"))))
		{
			player_log (ch, "[RPROG]", p);
		}
		if (!IS_SET (commands[i].flags, C_NWT))
			show_to_watchers (ch, argument);
		return;
	}
	if (get_second_affect(ch, SA_DOANYWAY, 0))
		remove_second_affect(get_second_affect(ch, SA_DOANYWAY, 0));

	if (!IS_MORTAL (ch) && !str_cmp (argument, "sho wl"))
	{
		send_to_char
			("Heh heh. Glad I added in this check, aren't we? No shouting for you.\n",
			ch);
		return;
	}

	if (ch->desc)
	{
		last_descriptor = ch->desc;
		sprintf (full_last_command, "Last Command Issued, by %s [%d]: %s",
			ch->tname, ch->in_room, argument);
		sprintf (last_command, "%s", argument);
	}

	social_args = argument;

	command_args = one_argument (argument, buf);

	if (!*buf)
		return;

	while (*command_args == ' ')
		command_args++;

	if (ch->pc && !GET_FLAG (ch, FLAG_ALIASING))
	{

		if ((alias = is_alias (ch, buf)))
		{

			ch->flags |= FLAG_ALIASING;

			while (alias)
			{

				command_interpreter (ch, alias->line);

				if (ch->deleted)
					return;

				alias = alias->next_line;
			}

			ch->flags &= ~FLAG_ALIASING;

			return;
		}
	}

	for (i = 1; *commands[i].command; i++)
		if (is_abbrev (buf, commands[i].command))
			break;

	if ((craft_affect = is_craft_command (ch, argument)))
		i = 0;

	if (IS_SET (commands[i].flags, C_IMP)) {
		cmd_level = 6;
	}
	else if (IS_SET (commands[i].flags, C_LV5)) {
		cmd_level = 5;
	}
	else if (IS_SET (commands[i].flags, C_LV4)) {
		cmd_level = 4;
	}
	else if (IS_SET (commands[i].flags, C_LV3)) {
		cmd_level = 3;
	}
	else if (IS_SET (commands[i].flags, C_LV2)) {
		cmd_level = 2;
	}
	else if (IS_SET (commands[i].flags, C_LV1)) {
		cmd_level = 1;
	}

	if (IS_SET (commands[i].flags, C_GDE)
		&& (IS_NPC (ch) || (!ch->pc->is_guide && !ch->pc->level)))
	{
		send_to_char ("Eh?\n\r", ch);
		return;
	}
	/* 
	Need to pass the CHAR_DATA pointer for the person who made the command and modify
	the following line to test the commanding char's trust against the trust level for
	the command.  - Methuselah
	*/

	if ((!*commands[i].command) 
		|| (cmd_level > GET_TRUST (ch)))
	{
		if (!social (ch, argument))
		{
			echo = number (1, 9);
			if (echo == 1)
				send_to_char ("Eh?\n\r", ch);
			else if (echo == 2)
				send_to_char ("Huh?\n\r", ch);
			else if (echo == 3)
				send_to_char ("I'm afraid that just isn't possible...\n\r", ch);
			else if (echo == 4)
				send_to_char ("I don't recognize that command.\n\r", ch);
			else if (echo == 5)
				send_to_char ("What?\n\r", ch);
			else if (echo == 6)
				send_to_char
				("Perhaps you should try typing it a different way?\n\r", ch);
			else if (echo == 7)
				send_to_char
				("Try checking your typing - I don't recognize it.\n\r", ch);
			else if (echo == 8)
				send_to_char
				("That isn't a recognized command, craft, or social.\n\r", ch);
			else
				send_to_char ("Hmm?\n\r", ch);
		}
		else
		{
			if (!IS_SET (commands[i].flags, C_NWT))
				show_to_watchers (ch, argument);
		}
		return;
	}

	if (ch->stun)
	{
		send_to_char ("You're still reeling.\n", ch);
		return;
	}

	if (ch->roundtime)
	{
		sprintf (buf, "You'll need to wait another %d seconds.\n",
			ch->roundtime);
		send_to_char (buf, ch);
		return;
	}

	if (IS_SET (commands[i].flags, C_WLK) &&
		(ch->moves || GET_FLAG (ch, FLAG_LEAVING)
		|| GET_FLAG (ch, FLAG_ENTERING)))
	{
		send_to_char ("Stop traveling first.\n\r", ch);
		return;
	}

	if (IS_SET (commands[i].flags, C_MNT) && IS_RIDER (ch))
	{
		send_to_char ("Get off your mount first.\n", ch);
		return;
	}

	if (commands[i].min_position > GET_POS (ch))
	{
		switch (GET_POS (ch))
		{
		case DEAD:
			if (IS_MORTAL (ch))
			{
				send_to_char ("You are dead.  You can't do that.\n\r", ch);
				return;
			}
		case UNCON:
		case MORT:
			send_to_char ("You're seriously wounded and unconscious.\n\r", ch);
			return;

		case STUN:
			send_to_char ("You're too stunned to do that.\n\r", ch);
			return;

		case SLEEP:
			send_to_char ("You can't do that while sleeping.\n\r", ch);
			return;

		case REST:
			send_to_char ("You can't do that while lying down.\n\r", ch);
			return;

		case SIT:
			send_to_char ("You can't do that while sitting.\n\r", ch);
			return;

		case FIGHT:
			send_to_char ("No way! You are fighting for your life!\n\r", ch);
			return;
		}

		return;
	}

	if (!IS_NPC (ch) && ch->pc->create_state == STATE_DIED &&
		!IS_SET (commands[i].flags, C_DOA))
	{
		send_to_char ("You can't do that when you're dead.\n\r", ch);
		return;
	}

	if (!IS_SET (commands[i].flags, C_BLD) && is_blind (ch))
	{
		if (get_equip (ch, WEAR_BLINDFOLD))
			send_to_char ("You can't do that while blindfolded.\n\r", ch);
		else
			send_to_char ("You can't do that while blind.\n\r", ch);
		return;
	}

	if ((af = get_affect (ch, MAGIC_AFFECT_PARALYSIS)) &&
		!IS_SET (commands[i].flags, C_PAR) && IS_MORTAL (ch))
	{
		send_to_char ("You can't move.\n", ch);
		return;
	}

	if (IS_SUBDUEE (ch) && !IS_SET (commands[i].flags, C_SUB) && !cmd_level)
	{
		act ("$N won't let you.", false, ch, 0, ch->subdue, TO_CHAR);
		return;
	}

	/* Most commands break delays */

	if (ch->delay && !IS_SET (commands[i].flags, C_DEL))
		break_delay (ch);

	/* Send this command to the log */
	if (!second_affect_active && (!IS_NPC (ch) || ch->desc))
	{
		if (IS_SET (commands[i].flags, C_NLG))
			;
		else if (i > 0)
		{			/* Log craft commands separately. */
			if (!str_cmp (commands[i].command, "."))
				player_log (ch, "say", command_args);
			else if (!str_cmp (commands[i].command, ","))
				player_log (ch, "emote", command_args);
			else if (!str_cmp (commands[i].command, ":"))
				player_log (ch, "emote", command_args);
			else if (!str_cmp (commands[i].command, ";"))
				player_log (ch, "wiznet", command_args);
			else
				player_log (ch, commands[i].command, command_args);
		}
	}

	if (IS_MORTAL (ch) && get_affect (ch, MAGIC_HIDDEN) &&
		!IS_SET (commands[i].flags, C_HID) &&
		skill_level (ch, SKILL_SNEAK, 0) < number (1, MAX(100, skill_level(ch, SKILL_SNEAK, 0))) &&
		would_reveal (ch))
	{
		remove_affect_type (ch, MAGIC_HIDDEN);
		act ("$n reveals $mself.", true, ch, 0, 0, TO_ROOM | _ACT_FORMAT);
		act ("Your actions have compromised your concealment.", true, ch, 0, 0,
			TO_CHAR);
	}

	/* Execute command */

	if (!IS_SET (commands[i].flags, C_NWT))
		show_to_watchers (ch, social_args);

	if (!i)			/* craft_command */
		craft_command (ch, command_args, craft_affect);
	else

		(*commands[i].proc) (ch, command_args, 0);

	last_descriptor = NULL;
}
Example #5
0
void
mobprog (CHAR_DATA * ch, CHAR_DATA * mob, MOBPROG_DATA * program, int trigger,
		 char *argument, int *ret)
{
	char line[MAX_STRING_LENGTH];
	char command[MAX_STRING_LENGTH];
	char *line_ptr;
	char *prog_ptr;
	char *prog;
	char token[MAX_STRING_LENGTH];
	int levels[MAX_PROG_LINES];
	char *level_ptrs[MAX_PROG_LINES];
	int level_ifs[MAX_DEPTH];
	int lines;
	int level;
	int cur_level;
	int line_no;
	int i;

	*ret = 0;

	// temporary lockout
	if (1 || !engine.in_test_mode ())
	{
		return;
	}

	if (ch->desc)
	{
		return;
	}

	// don't want progs active on bp
	if (engine.in_build_mode ())
		return;

	prog = program->prog;

	for (lines = 0; lines < MAX_PROG_LINES; lines++)
	{
		levels[lines] = 0;
		level_ptrs[lines] = NULL;
	}

	setvar (mob, "mob", (long int) mob, MP_TYPE_CHAR_DATA);
	setvar (mob, "ch", (long int) ch, MP_TYPE_CHAR_DATA);
	setvar (mob, "room", (long int) vtor (mob->in_room), MP_TYPE_ROOM_DATA);

	prog_ptr = prog;

	level = 0;
	lines = 0;

	while ((level_ptrs[lines] = get_line (&prog_ptr, line)))
	{

		line_ptr = line;

		get_prog_token (&line_ptr, token);

		if (!str_cmp (token, "if") || !str_cmp (token, "while"))
			levels[lines] = level++;

		else if (!str_cmp (token, "elseif") || !str_cmp (token, "else"))
			levels[lines] = level - 1;

		else if (!str_cmp (token, "endif") || !str_cmp (token, "endwhile"))
			levels[lines] = --level;

		else
			levels[lines] = level;

		lines++;
	}

	line_no = 0;

	/* Re-entry for a delayed trigger */

	if (ch->trigger_id == trigger)
	{

		/* Reset delayed trigger if trigger re-activated (vs
		the delay timer expired) */

		if (!ch->trigger_delay)
		{

			/* Make it so all ifs (elseifs..) appear executed */

			for (i = 0; i < MAX_DEPTH; i++)
				level_ifs[i] = 1;

			line_no = ch->trigger_line;
		}

		ch->trigger_id = 0;
		ch->trigger_delay = 0;
	}

	prog_ptr = level_ptrs[line_no];

	while (get_line (&prog_ptr, line))
	{

		strcpy (current_line, line);

		if (GET_POS (ch) == POSITION_DEAD)
		{
			*ret = 0;
			return;
		}

		line_ptr = line;

		get_prog_token (&line_ptr, token);

		if (*token == '!')
			;

		else if (!*token || *token == '\n' || *token == '\r' || *token == ' ')
			;

		else if (!str_cmp (token, "ci"))
		{

			mob_string (mob, &line_ptr, command);

			if (*command)
				command_interpreter (mob, command);

			if (mob->deleted)
				return;

			if (mob->delay ||
				GET_FLAG (mob, FLAG_ENTERING) || GET_FLAG (mob, FLAG_LEAVING))
			{

				mob->flags |= FLAG_INHIBITTED;
				mob->trigger_delay = 1;
				mob->trigger_line = line_no + 1;
				mob->trigger_id = trigger;
				return;
			}
		}

		else if (!str_cmp (token, "global") || !str_cmp (token, "var"))
			define_variable (mob, program, line_ptr);

		else if (!str_cmp (token, "while"))
		{

			require_open_paren (&line_ptr);

			cur_level = levels[line_no];

			if (!mp_eval_eq (mob, &line_ptr))
			{

				line_no++;

				while (levels[line_no] != cur_level)
					line_no++;
			}
		}

		else if (!str_cmp (token, "if") || !str_cmp (token, "elseif"))
		{

			cur_level = levels[line_no];

			if (!str_cmp (token, "if"))
				level_ifs[cur_level] = 0;

			if (!level_ifs[cur_level])
				require_open_paren (&line_ptr);

			if (level_ifs[cur_level] || !mp_eval_eq (mob, &line_ptr))
			{

				while (levels[line_no + 1] != cur_level)
					line_no++;

			}
			else
				level_ifs[cur_level] = 1;
		}

		else if (!str_cmp (token, "else"))
		{

			cur_level = levels[line_no];

			if (level_ifs[cur_level])
			{

				while (levels[line_no + 1] != cur_level)
					line_no++;
			}
		}

		else if (!str_cmp (token, "reject_command"))
		{
			*ret = 0;
			return;
		}

		else if (!str_cmp (token, "endwhile"))
		{

			cur_level = levels[line_no];

			if (line_no > 0)	/* If there is an endwhile on the first line */
				line_no--;

			while (line_no && levels[line_no] != cur_level)
				line_no--;

			line_no--;		/* Gets incremented at the end of the while */
		}

		else if (!str_cmp (token, "endif"));

		else if (!str_cmp (token, "delay"))
		{

			/* A previously delayed trigger is forgotten */

			mob->trigger_delay = mp_eval_eq (mob, &line_ptr);
			mob->trigger_line = line_no + 1;
			mob->trigger_id = trigger;
			return;
		}

		else if (!str_cmp (token, "alarm"))
			mob->alarm = mp_eval_eq (mob, &line_ptr);

		else if (!str_cmp (token, "return"))
			return;

		else
			assignment (mob, program, token, &line_ptr);

		prog_ptr = level_ptrs[++line_no];
	}
}