/*********************************************************************/
/* file: substitute.c - functions related to the substitute command  */
/*                             TINTIN III                            */
/*          (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t             */
/*                     coded by peter unold 1992                     */
/*********************************************************************/
#include <string.h>
#include "tintin.h"

extern struct listnode *common_subs;
extern char vars[10][BUFFER_SIZE]; /* the &0, &1, &2,....&9 variables */

/***************************/
/* the #substitute command */
/***************************/
void parse_sub(char *arg, struct session *ses)
{
  char left[BUFFER_SIZE], right[BUFFER_SIZE];
  struct listnode *mysubs, *ln;

  mysubs=(ses) ? ses->subs : common_subs;

  arg=get_arg_stop_spaces(arg, left);
  arg=get_arg_with_spaces(arg, right);

  if(!*left) {
    puts("#THESE SUBSTITUTES HAS BEEN DEFINED:");
    show_list(mysubs);
    prompt(ses);
  }

  else if(*left && !*right) {
    if((ln=searchnode_list(mysubs, left))!=NULL) {
      shownode_list(ln);
      prompt(ses);
    }
    else
      tintin_puts("#THAT SUBSTITUTE IS NOT DEFINED.", ses);
  }

  else {
    if((ln=searchnode_list(mysubs, left))!=NULL)
      deletenode_list(mysubs, ln);
    insertnode_list(mysubs, left, right);
    tintin_puts("#OK. SUBSTITUTE DEFINED.", ses);
  }
}


/*****************************/
/* the #unsubstitute command */
/*****************************/
void unsubstitute_command(char *arg, struct session *ses)
{
  char left[BUFFER_SIZE];
  struct listnode *mysubs, *ln;

  mysubs=(ses) ? ses->subs : common_subs;

  arg=get_arg_with_spaces(arg, left);

  if((ln=searchnode_list(mysubs, left))!=NULL) {
    deletenode_list(mysubs, ln);
    tintin_puts("#OK. SUBSTITUTE DELETED", ses);
  }
  else
    tintin_puts("#THAT SUBSTITUTE IS NOT DEFINED.", ses);
}


/**************************************************************/
/* run through output from mud, and substitute text if needed */
/**************************************************************/
void do_all_subs(char *buffer, char *result, struct session *ses)
{
  int n;
  char *cpsource, *cpdest, linebuffer[BUFFER_SIZE];


  cpsource=buffer; 
  cpdest=linebuffer;

  while(*cpsource) {  /*cut out each of the lines and sub'em if a sub is triggered*/
    if(*cpsource=='\n' || *cpsource=='\r') {
      *cpdest='\0';      
      do_one_sub(linebuffer, ses);
      if(!(*linebuffer=='.' && !*(linebuffer+1))) {
        n=strlen(linebuffer);
        memcpy(result, linebuffer, n);
        result+=n;
        *result++=*cpsource++;
        if(*cpsource=='\n' || *cpsource=='\r') 
          *result++=*cpsource++;
      }
      else 
        if(*++cpsource=='\n' || *cpsource=='\r') 
          cpsource++;

      cpdest=linebuffer;
    }
    else
      *cpdest++=*cpsource++;
  }
  *cpdest='\0';
  do_one_sub(linebuffer, ses);
  n=strlen(linebuffer);
  memcpy(result, linebuffer, n);
  result+=n;
  *result='\0';
}


void do_one_sub(char *line, struct session *ses)
{
  struct listnode *ln=ses->subs;

  while(ln=ln->next) 
    if(check_one_action(line, ln->left))
      prepare_actionalias(ln->right, line);
}