/
Sapphire/bin/
Sapphire/db/
Sapphire/db/OLC_rooms/
Sapphire/db/abi/
Sapphire/db/em_src/
Sapphire/db/helps/
Sapphire/db/helps/emman/ifunc/
Sapphire/db/npcs/Tatt/
Sapphire/db/objects/Tatt/
Sapphire/db/q_data/
Sapphire/db/rooms/Tatt/
Sapphire/doc/
Sapphire/doc/em/
Sapphire/etc/
Sapphire/src/abic/
Sapphire/src/areacon/
Sapphire/src/client/
Sapphire/src/embc/
Sapphire/src/emi/
Sapphire/src/emi/test/
Sapphire/src/include/
Sapphire/src/sapphire/em/
Sapphire/src/tcon/
/*
 * Copyright (C) 1995-1997 Christopher D. Granz
 *
 * This header may not be removed.
 *
 * Refer to the file "License" included in this package for further
 * information and before using any of the following.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include "sapphire.h"


/*
 * Prototypes
 */
static int       goto_line                     ( char *, int, char ** );
static void      finish_text_editor                ( TERM_DATA *pTerm );


/*
 * Functions
 */
void process_text_editor_string( TERM_DATA *pTerm, char *pString )
{
    char cBuf[MAX_STRING];
    char *pBuf;
    char *pBuf2;
    int i;

    /* if ( next_char( pString ) == '\0' )
        return; */

    if ( pString[0] == '-' )
    {
        switch ( pString[1] )
        {
          case 'h':
              write_string_buffer( pTerm,
                "Valid text-editor options:\n\r"
                "  --       - `-'.\n\r"
                "  -h       - This help.\n\r"
                "  -d       - Finish editing.\n\r"
                "  -s       - Show string.\n\r"
                "  -c       - Clear string.\n\r"
                "  -f       - Format string.\n\r"
                "  -l       - Show current line.\n\r"
                "  -g<num>  - Goto line <num>.\n\r"
                "  -a       - Current line is pushed down and a new "
                "line is added\n\r"
                "             in it's place.\n\r"
                "  -e<str>  - Change current line to <str>.\n\r"
                "  -r       - Remove current line and move following line "
                "up.\n\r"
             /* "  -x<str>  - Execute <str> as a command.\n\r" */ );
              break;

          case 'd':
              finish_text_editor( pTerm );
              break;

          case 's':
              setup_string_pager( pTerm );
              page_string( pTerm, pTerm->pEditString );
              page_string( pTerm, "\n\r" );
              finish_string_pager( pTerm );
              break;

          case 'c':
              pTerm->pEditString[0] = '\0';
              pTerm->iEditLine      = 1;
              break;

          case 'f':
              strcpy( pTerm->pEditString,
                format_string( pTerm->pEditString ) );
              pTerm->iEditLine      = goto_line( pTerm->pEditString,
                                        pTerm->iEditLine, &pBuf );
              break;

          case 'l':
              goto_line( pTerm->pEditString, pTerm->iEditLine, &pBuf );

              for ( i = 0; pBuf[i] != '\0'; i++ )
              {
                  if ( pBuf[i] == '\n' || pBuf[i] == '\r' )
                      break;

                  cBuf[i]           = pBuf[i];
              }

              cBuf[i]               = '\0';
              write_string_buffer( pTerm, cBuf );
              write_string_buffer( pTerm, "\n\r" );
              break;

          case 'g':
              one_arg( &pString[2], cBuf );
              pTerm->iEditLine      = goto_line( pTerm->pEditString,
                                        atoi( cBuf ), &pBuf );
              break;

          case 'a':
              goto_line( pTerm->pEditString, pTerm->iEditLine, &pBuf );
              pBuf2                 = pBuf;

              for ( i = 0; *pBuf2 != '\0'; pBuf2++, i++ )
                  cBuf[i]           = *pBuf2;

              cBuf[i]               = '\0';
              strcpy( pBuf, "\n\r" );

              if ( ( strlen( pTerm->pEditString ) + i ) >= MAX_STRING )
              {
                  write_string_buffer( pTerm, "String too long.\n\r" );
                  finish_text_editor( pTerm );
                  break;
              }

              strcat( pBuf, cBuf );
              break;

          case 'e':
              goto_line( pTerm->pEditString, pTerm->iEditLine, &pBuf );
              pBuf2                 = pBuf;

              while ( *pBuf2 != '\0' )
              {
                  if ( *pBuf2 == '\n' )
                      break;

                  pBuf2++;
              }

              for ( i = 0; *pBuf2 != '\0'; pBuf2++, i++ )
                  cBuf[i]           = *pBuf2;

              cBuf[i]               = '\0';
              strcpy( pBuf, &pString[2] );

              if ( ( strlen( pTerm->pEditString ) + i ) >= MAX_STRING )
              {
                  write_string_buffer( pTerm, "String too long.\n\r" );
                  finish_text_editor( pTerm );
                  break;
              }

              strcat( pBuf, cBuf );
              break;

          case 'r':
              goto_line( pTerm->pEditString, pTerm->iEditLine, &pBuf );
              pBuf2                 = pBuf;

              while ( *pBuf2 != '\0' )
              {
                  if ( *pBuf2 == '\n' )
                      break;

                  pBuf2++;
              }

              if ( *pBuf2 == '\n' )
                  pBuf2            += 2;

              for ( i = 0; *pBuf2 != '\0'; pBuf2++, i++ )
                  cBuf[i]           = *pBuf2;

              cBuf[i]               = '\0';
              strcpy( pBuf, cBuf );

              if ( pTerm->iEditLine > 1 && cBuf[0] == '\0' )
              {
                  pTerm->iEditLine--;

                  goto_line( pTerm->pEditString, pTerm->iEditLine, &pBuf );

                  while ( *pBuf != '\0' )
                  {
                      if ( *pBuf == '\n' )
                          break;

                      pBuf++;
                  }

                  *pBuf             = '\0';
              }

              break;
#if 0
          case 'x':
              switch ( pTerm->iConState )
              {
                case CON_PLAYING      :
                    process_cmd( pTerm, &pString[2] );
                    break;

                case CON_NPC_EDITOR   :
                    process_npc_editor_cmd( pTerm, &pString[2] );
                    break;

                case CON_OBJECT_EDITOR:
                    process_object_editor_cmd( pTerm, &pString[2] );
                    break;

                case CON_ROOM_EDITOR  :
                    process_room_editor_cmd( pTerm, &pString[2] );
                    break;

                case CON_SYSTEM_SHELL :
                    process_shell_cmd( pTerm, &pString[2] );
                    break;
              }

              break;
#endif
          case '-':
              pString                 = &pString[1];
              goto end;

          default :
              write_string_buffer( pTerm,
                "Invalid option.  Type `-h' for help.\n\r\n\r" );
              break;
        }

        return;
    }

end:
    if ( ( strlen( pString ) + strlen( pTerm->pEditString ) + 3 )
      > MAX_STRING )
    {
        write_string_buffer( pTerm, "String too long.\n\r" );
        finish_text_editor( pTerm );
        return;
    }

    strcat( pTerm->pEditString, "\n\r" );
    strcat( pTerm->pEditString, pString );
}


static int goto_line( char *pStr, int iLine, char **ppPos )
{
    int iCurrLine = 1;
    int i;

    if ( iLine < 1 )
    {
        *ppPos    = pStr;
        return ( 1 );
    }

    for ( i = 0; ( pStr[i] != '\0' && iCurrLine != iLine ); i++ )
    {
        if ( pStr[i] == '\n' )
            iCurrLine++;
    }

    if ( pStr[i] == '\r' )
        i++;

    *ppPos        = &pStr[i];
    return ( MIN( iCurrLine, iLine ) );
}


void process_page_string( TERM_DATA *pTerm, char *pCommand )
{
    char cBuf[MAX_STRING];
    int iLines              = 1;
    int i;

    if ( next_char( pCommand ) != '\0' )
    {
        free_mem( (void **) &pTerm->pPageString );
        pTerm->pPagePos     = NULL;
        pTerm->iPageMemSize = 0;
        return;
    }

    for ( i = 0; *pTerm->pPagePos != '\0'; i++ )
    {
        if ( *pTerm->pPagePos == '\n' )
            iLines++;

        if ( iLines == pTerm->iPageLines || ( i + 3 ) >= MAX_STRING )
            break;

        cBuf[i]             = *pTerm->pPagePos++;
    }

    if ( *pTerm->pPagePos != '\0' )
    {
        cBuf[i++]           = '\n';
        cBuf[i++]           = '\r';
    }
    else
    {
        free_mem( (void **) &pTerm->pPageString );
        pTerm->pPagePos     = NULL;
        pTerm->iPageMemSize = 0;
    }

    cBuf[i]                 = '\0';
    write_string_buffer( pTerm, cBuf );

}


/*
 * Setup a terminal to use the string editor.
 */
void setup_text_editor( TERM_DATA *pTerm, char **ppText, bool bAppend )
{
    int i;

    pTerm->pEditString    = alloc_mem( MAX_STRING );

    pTerm->pEditString[0] = '\0';

    if ( *ppText != NULL && bAppend != TRUE )
    {
        strncpy( pTerm->pEditString, *ppText, ( MAX_STRING - 1 ) );
        pTerm->pEditString[MAX_STRING - 1] = '\0';
    }

    pTerm->ppEditString   = ppText;
    pTerm->iEditLine      = 1;
    pTerm->bEditAppend    = bAppend;

    for ( i = 0; pTerm->pEditString[i] != '\0'; i++ )
    {
        if ( pTerm->pEditString[i] == '\n' )
            pTerm->iEditLine++;
    }

    process_text_editor_string( pTerm, "-h" );
}


/*
 * Setup the string pager.
 */
void setup_string_pager( TERM_DATA *pTerm )
{
    pTerm->pPageString  = alloc_mem( MAX_STRING );
    pTerm->pPagePos     = pTerm->pPageString;
    pTerm->iPageMemSize = MAX_STRING;
}


void page_string( TERM_DATA *pTerm, char *pStr )
{
    int i;

    if ( pStr == NULL || pStr[0] == '\0' )
        return;

    i = ( strlen( pTerm->pPageString ) + strlen( pStr ) + 1 );

    if ( i > pTerm->iPageMemSize )
        pTerm->pPageString = realloc_mem( pTerm->pPageString,
                               ( pTerm->iPageMemSize = i ) );

    pTerm->pPagePos        = pTerm->pPageString;
    strcat( pTerm->pPageString, pStr );
}


void finish_string_pager( TERM_DATA *pTerm )
{
    pTerm->pPagePos = pTerm->pPageString;
    process_page_string( pTerm, "" );
}


static void finish_text_editor( TERM_DATA *pTerm )
{
    if ( pTerm->bEditAppend == TRUE && *pTerm->ppEditString != NULL )
        snprintf( pTerm->pEditString, MAX_STRING, "%s\n\r%s",
          *pTerm->ppEditString, pTerm->pEditString );

    free_string( pTerm->ppEditString );
    *pTerm->ppEditString = save_string( pTerm->pEditString );

    free_mem( (void **) &pTerm->pEditString );
    pTerm->pEditString   = NULL;
    pTerm->ppEditString  = NULL;
}


/*
 * End of text.c
 */