/* 
   elmo - ELectronic Mail Operator

   Copyright (C) 2003 rzyjontko

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software Foundation,
   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

   ----------------------------------------------------------------------
   
   String manipulation routines.
   
*/
/****************************************************************************
 *    IMPLEMENTATION HEADERS
 ****************************************************************************/

#include <string.h>

#include "linech.h"
#include "xmalloc.h"

/****************************************************************************
 *    IMPLEMENTATION PRIVATE DEFINITIONS / ENUMERATIONS / SIMPLE TYPEDEFS
 ****************************************************************************/

#define MIN(a,b) (((a)<(b))?(a):(b))

/****************************************************************************
 *    IMPLEMENTATION PRIVATE CLASS PROTOTYPES / EXTERNAL CLASS REFERENCES
 ****************************************************************************/
/****************************************************************************
 *    IMPLEMENTATION PRIVATE STRUCTURES / UTILITY CLASSES
 ****************************************************************************/
/****************************************************************************
 *    IMPLEMENTATION REQUIRED EXTERNAL REFERENCES (AVOID)
 ****************************************************************************/
/****************************************************************************
 *    IMPLEMENTATION PRIVATE DATA
 ****************************************************************************/

static void
copy_string (chtype *dest, const char *from, int len, int mask)
{
  while (len){
    *dest = (*from & ~A_ATTRIBUTES) | mask;
    dest++;
    from++;
    len--;
  }
}



static void
write_spaces (linech_t *line, int len)
{
  int i;
  
  for (i = len; i < line->filled - len; i++){
    line->str[i] = ' ';
  }
  line->filled = len;
}

/****************************************************************************
 *    INTERFACE DATA
 ****************************************************************************/

linech_t *
linech_create (int size)
{
  linech_t *result = xmalloc (sizeof (linech_t));

  result->filled    = size;
  result->size      = size;
  result->str       = xmalloc ((size + 1) * sizeof (chtype));
  result->str[size] = 0;
  result->mask      = 0;

  linech_put_str_len (result, NULL, 0);
  
  return result;
}



void
linech_destroy (linech_t *line)
{
  if (line == NULL || line->str == NULL)
    return;
  xfree (line->str);
  xfree (line);
}



void
linech_clear (linech_t *line)
{
  line->filled = line->size;

  linech_put_str_len (line, NULL, 0);
}



void
linech_put_str_len (linech_t *line, const char *str, int len)
{
  len = MIN (len, line->size - 1);
  copy_string (line->str, str, len, line->mask);
  write_spaces (line, len);
}



void
linech_set_mask (linech_t *line, int mask)
{
  line->mask |= mask;
}



void
linech_unset_mask (linech_t *line, int mask)
{
  line->mask &= ~mask;
}



void
linech_add_char (linech_t *line, char c)
{
  if (line->filled >= line->size - 1)
    return;
  line->str[line->filled] = c;
  line->filled++;
}



void
linech_add_str_len (linech_t *line, const char *str, int len)
{
  len = MIN (len, line->size - 1 - line->filled);
  copy_string (line->str + line->filled, str, len, line->mask);
  line->filled += len;
}



void
linech_add_str_pad (linech_t *line, const char *str, int pad_len)
{
  int i;
  int len;

  len = (str) ? strlen (str) : 0;

  if (len < pad_len){
    linech_add_str_len (line, str, len);
    for (i = 0; i < pad_len - len; i++)
      linech_add_char (line, ' ');
  }
  else {
    linech_add_str_len (line, str, pad_len);
  }
}

/****************************************************************************
 *    IMPLEMENTATION PRIVATE FUNCTION PROTOTYPES
 ****************************************************************************/
/****************************************************************************
 *    IMPLEMENTATION PRIVATE FUNCTIONS
 ****************************************************************************/
/****************************************************************************
 *    INTERFACE FUNCTIONS
 ****************************************************************************/
/****************************************************************************
 *    INTERFACE CLASS BODIES
 ****************************************************************************/
/****************************************************************************
 *
 *    END MODULE linech.c
 *
 ****************************************************************************/


syntax highlighted by Code2HTML, v. 0.9.1