#ifndef __RSTRING_H__
#define __RSTRING_H__ 1
/*
elmo - ELectronic Mail Operator
Copyright (C) 2002, 2003, 2004 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.
----------------------------------------------------------------------
Please read it carefully before using this module!
1.
This implements very simple (and thus fast) module that simplifies
operations on arrays of null-terminated strings. Array's last element
is NULL pointer -- this means that
ptr->array[ptr->count] == NULL;
2.
Pointers in array are not copies of originals. They point to original
string and if you accidentaly free that pointer (or memory block) you
will get segfault as soon as you try to dereference this pointer (this
is an optimistic scenario). Be aware of what can happen if you
accidentaly overwrite data in string...
3.
Removal of any element may result in diffrent succession of elements in
array so I would not depend on it.
4.
Splitted string IS MODIFIED. If you accidentaly remove first element
and did not save somewhere pointer to splitted string you won't be able
to free this string.
5.
If you split string twice with the same delimiter/regexp second array
will have exactly 1 element (because original string will get \0 after
first match). It is quite possible, that you will try to free that
memory block twice...
6.
If you put dynamically allocated strings into array you have to care
yourself about freeing them. This module won't do it for you. It only
frees memory used for its own purpose.
7.
rstring made by splitting string is created with rstring_create, so you
should call rstring_delete when it is not needed any more or you'll get
a memory leak.
8.
This is not a C++ class and you are encouraged to use structure
implementation. I wrote these functions only to make it easier to
operate on (char **) objects.
It is very simple to iterate through array like this:
char **txt;
for (txt = ptr->array; *txt; txt++){
// do the work
}
*/
/*****************************************************************************
* INTERFACE REQUIRED HEADERS
****************************************************************************/
#include <stdio.h>
#include "memchunk.h"
/*****************************************************************************
* INTERFACE DEFINITIONS / ENUMERATIONS / SIMPLE TYPEDEFS
****************************************************************************/
#ifdef __GNUC__
# define FMT __attribute__ ((format (printf, 2, 3)))
#else
# define FMT
#endif
/****************************************************************************
* INTERFACE CLASS PROTOTYPES / EXTERNAL CLASS REFERENCES
****************************************************************************/
/****************************************************************************
* INTERFACE STRUCTURES / UTILITY CLASSES
****************************************************************************/
struct rstring {
char **array;
int size;
int count;
unsigned allocated_first : 1;
unsigned allocated_all : 1;
};
typedef struct rstring rstring_t;
/****************************************************************************
* INTERFACE DATA DECLARATIONS
****************************************************************************/
/****************************************************************************
* INTERFACE FUNCTION PROTOTYPES
****************************************************************************/
extern rstring_t *rstring_create (void);
extern rstring_t *rstring_create_size (int size);
extern void rstring_delete (rstring_t *ptr);
extern void rstring_add (rstring_t *ptr, char *txt);
extern void rstring_sprintf (rstring_t *ptr, const char *fmt, ...) FMT;
extern void rstring_remove (rstring_t *ptr, unsigned index);
extern void rstring_shrink (rstring_t *ptr);
extern rstring_t *rstring_split (char *txt, const char *delimiter);
extern rstring_t *rstring_split_re (char *txt, const char *re);
extern rstring_t *rstring_split_lines (char *txt, size_t line_len);
extern rstring_t *rstring_join (rstring_t *x, rstring_t *y);
extern rstring_t *rstring_copy (rstring_t *x);
extern void rstring_free_strings (rstring_t *x);
extern void rstring_free_firstn_strings (rstring_t *x, int n);
extern void rstring_dump (memchunk_t *memchunk, rstring_t *x);
extern rstring_t *rstring_read (memchunk_t *memchunk);
extern char *rstring_flatten (rstring_t *ptr, const char *delim);
/****************************************************************************
* INTERFACE OBJECT CLASS DEFINITIONS
****************************************************************************/
/****************************************************************************
* INTERFACE TRAILING HEADERS
****************************************************************************/
/****************************************************************************
*
* END HEADER rstring.h
*
****************************************************************************/
#endif
syntax highlighted by Code2HTML, v. 0.9.1