view th_string.h @ 0:728243125263

Import.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 20 Mar 2008 00:15:03 +0000
parents
children 707e35b03f89
line wrap: on
line source

/*
 * Miscellaneous string-handling related utility-functions
 * Programmed and designed by Matti 'ccr' Hamalainen
 * (C) Copyright 2002-2008 Tecnic Software productions (TNSP)
 *
 * Please read file 'COPYING' for information on license and distribution.
 */
#ifndef _TH_STRING_H
#define _TH_STRING_H

#ifdef __cplusplus
extern "C" {
#endif

#include "th_util.h"
#include <stdlib.h>
#include <ctype.h>

/*
 * Macros
 */
/* TODO - Remove usage of libc functions for increased portability.
 * Possible issues are locales, impossible to implement them...
 */
#define th_isalnum(c)	isalnum((int)(unsigned char) c)
#define th_isalpha(c)	isalpha((int)(unsigned char) c)
#define th_isascii(c)	isascii((int)(unsigned char) c)
#define th_isblank(c)	isblank((int)(unsigned char) c)
#define th_iscntrl(c)	iscntrl((int)(unsigned char) c)
#define th_isdigit(c)	isdigit((int)(unsigned char) c)
#define th_isgraph(c)	isgraph((int)(unsigned char) c)
#define th_islower(c)	islower((int)(unsigned char) c)
#define th_isprint(c)	isprint((int)(unsigned char) c)
#define th_ispunct(c)	ispunct((int)(unsigned char) c)
#define th_isspace(c)	isspace((int)(unsigned char) c)
#define th_isupper(c)	isupper((int)(unsigned char) c)
#define th_isxdigit(c)	isxdigit((int)(unsigned char) c)
#define th_iscrlf(c)	((c=='\r')||(c=='\n'))

#define th_isspecial(q)	(((q >= 0x5b) && (q <= 0x60)) || ((q >= 0x7b) && (q <= 0x7d)))

#define th_tolower(c)	tolower((int)(unsigned char) c)
#define th_toupper(c)	toupper((int)(unsigned char) c)

/*
 * Typedefs and structures
 */
typedef struct tstrnode {
	char_t	*pcStr;		/* String */
	ulint_t	nUsed;		/* Times this string has been referenced */
	void	*pData;		/* Extra data */
	
	struct tstrnode *pPrev, *pNext;
} t_str_node;


#define SET_HASH_MAXINDEX	(256)

typedef t_str_node *t_str_hash[SET_HASH_MAXINDEX];


typedef struct tstrindex {
	t_str_node	**ppIndex;
	ulint_t		n;
} t_str_index;


/*
 * Normal NUL-terminated string functions
 */
char_t *th_stralloc(size_t);
char_t *th_strrealloc(char_t *, size_t);
size_t	th_strlen(char_t *);
char_t *th_strdup(char_t *);
char_t *th_strcat(char_t *, char_t *);
char_t *th_strcpy(char_t *, char_t *);
char_t *th_strncpy(char_t *, char_t *, size_t);
int	th_strcmp(char_t *, char_t *);
int	th_strncmp(char_t *, char_t *, size_t);
int	th_strcasecmp(char_t *, char_t *);
int	th_strncasecmp(char_t *, char_t *, size_t);
void	th_strip_ctrlchars(char_t *);
char_t *th_strstr(char_t *, char_t *);

int	th_pstrcpy(char_t **, char_t *);
int	th_pstrcat(char_t **, char_t *);

char_t	*th_findnext(char_t *, size_t *);
char_t	*th_findsep(char_t *, size_t *, char_t);
char_t	*th_findseporspace(char_t *, size_t *, char_t);

BOOL	th_strmatch(char_t *, char_t *);
BOOL	th_strcasematch(char_t *, char_t *);


/*
 * Handling of string-lists and hashes
 */
t_str_node *	th_strnode_new(char_t *, ulint_t, void *);
void		th_strnode_free(t_str_node *);
void		th_strlist_free(t_str_node *);
void		th_strlist_insert(t_str_node **, t_str_node *);
int		th_strhash_insert(t_str_node **, t_str_node *, BOOL);
void		th_strhash_free(t_str_node **);
void		th_strhash_change_pdata(t_str_hash, void *, void *);
t_str_node *	th_strhash_search(t_str_node **, char_t *, BOOL);
t_str_index *	th_strhash_makeindex(t_str_node **);
t_str_index *	th_strlist_makeindex(t_str_node *);
void		th_strindex_free(t_str_index *);
void		th_strindex_sort_nused(t_str_index *);
void		th_strindex_sort_alpha(t_str_index *);

#ifdef __cplusplus
}
#endif
#endif /* _TH_STRING_H */